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

2024-09-25 08:35:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多方法,它们彼此独立,但需要一起计算输出。因此,当任何方法中的一个变量发生变化时,所有方法都会在计算中调用,这既慢又昂贵。以下是我所拥有的快速pesudo代码:

# 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进行比较并删除这些浪费的重复计算的最佳方法是什么?你知道吗


Tags: 方法selfreturndefvariableoneampcompute
2条回答

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

这是@holdenweb在评论中指出的memoize函数的“粗糙”实现。你知道吗

您可以考虑使方法^{}使用dict来查找以前存储的计算结果(可能在类名称空间中是最好的,以允许在所有实例中优化memoizing)。你知道吗

但是,如果使用许多参数调用这些方法,那么内存需求可能会非常严重,在这种情况下,您可能希望采用"publish and subscribe"模式来尝试使您的计算更“收缩”(松散地由数据中的变化驱动)。你知道吗

这是两种方法。我相信我会想得更多。你知道吗

相关问题 更多 >