我有许多方法彼此独立但需要共同计算输出。因此,当任何方法中的变量改变时,在计算中调用所有方法,这是缓慢且昂贵的。这是我所拥有的快速伪造代码:
# 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
进行比较并删除这些浪费的重复计算的最佳方法是什么?
答案 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会想到更多。