【问题标题】:Checking input values to methods to reduce the number of computations检查方法的输入值以减少计算次数
【发布时间】:2014-08-01 03:13:51
【问题描述】:

我有许多相互独立但需要共同计算输出的方法。因此,当任何方法中的变量发生变化时,所有方法都会在计算中被调用,这既慢又昂贵。这是我所拥有的快速伪代码:

# o represents an origin variable
# valueA represents a variable which can change
def a (o, valueA): 
    # calculations
    return resultA

def b (o, valueB):
    # calculations
    return resultA

def c (o, valueC1, valueC2):
    # calculations
    return resultA

def compute (A, B, C1, C2):
    one = self.a(o, A)
    two = self.b(one,B)
    three = self.c(two, C1, C2)
    return img

例如当C1的值发生变化时,当调用compute时,尽管ab没有变化,所有的方法都会被计算出来。我想要的是某种方式来检查A,B,C1,C2 的哪些值在每次调用compute 之间发生了变化。

我考虑过定义一个值列表,然后在下一次调用时将其与传递给compute 的新值进行比较。例如;第一次调用:list=[1,2,3,4] 第二次调用list=[1,3,4,5] 所以bc 需要计算,但a 是一样的。但是,我不确定如何从比较到定义要调用的方法?

我的特定应用程序的一些背景信息,以防万一。我有一个带有滑块的 wxPython 窗口,这些滑块确定图像处理的值,并且在这些滑块的每次更改时都会绘制一个图像。

将每次调用与compute 进行比较并删除这些浪费的重复计算的最佳方法是什么?

【问题讨论】:

    标签: python python-2.7 methods wxpython


    【解决方案1】:

    如果我必须解决这个问题,我会使用字典,其中键是 valueX(如果有多个,则为它的列表,在您的示例 C 中),并且值应该是函数的结果。

    所以,你应该有这样的东西:

    { valueA: resultA, valueB: resultB, [valueC1, valueC2]: resultC } 
    

    为此,您必须在函数中添加它:

    def a(o, valueA):
        [calcs]
        dic[valueA] = resultA
        return resultA
    [...]
    def c(o, valueC1, valueC2)
        [calcs]
        dic[[valueC1, valueC2]] = resultC
        return resultC
    

    并且,在计算的函数中,您可以尝试获取参数的值,如果没有得到值,则计算它

    def compute (A, B, C1, C2):
        one = dic.get(A) if dic.get(A) else self.a(o, A)
        two = dic.get(B) if dic.get(B) else self.b(one,B)
        three = dic.get([C1,C2]) if dic.get([C1,C1]) else self.c(two, C1, C2)
        return img
    

    PD:这是@holdenweb 在他的评论中指出的 memoize 函数的“粗略”实现。

    【讨论】:

      【解决方案2】:

      您可以考虑创建使用 dict 的方法 memoizing functions 来查找先前存储的计算的结果(可能最好在类命名空间中,以便在所有实例中优化记忆)。

      但是,如果使用许多参数调用方法,则内存要求可能非常严格,在这种情况下,您可能希望采用"publish and subscribe" 模式来尝试使您的计算更加“收缩”(由数据,松散地)。

      这是几种方法。我相信 SO 会想得更多。

      【讨论】:

        猜你喜欢
        • 2021-10-24
        • 2021-06-21
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多