检查方法的输入值以减少计算次数

时间:2014-08-01 03:13:51

标签: python python-2.7 methods wxpython

我有许多方法彼此独立但需要共同计算输出。因此,当任何方法中的变量改变时,在计算中调用所有方法,这是缓慢且昂贵的。这是我所拥有的快速伪造代码:

# 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时,尽管a& b没有变化。我想要的是检查A,B,C1,C2的每次调用之间compute的哪些值发生了变化的某种方式。

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

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

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

2 个答案:

答案 0 :(得分:2)

如果我必须解决这个问题,我会使用一个Dictionary,其中键是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

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

答案 1 :(得分:1)

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

内存要求可能非常严重,但是,如果使用多个参数调用方法,在这种情况下,您可能希望采用"publish and subscribe"模式来尝试使计算更多"收缩期&# 34; (由数据的变化驱动,松散地)。

这'几种方法。我确信SO会想到更多。