【发布时间】:2017-10-20 00:09:29
【问题描述】:
我对缓存和记忆的概念相当陌生。我已经阅读了一些其他讨论和资源 here、here 和 here,但一直无法很好地关注它们。
假设我在一个类中有两个成员函数。 (下面的简化示例。)假设第一个函数total 计算量很大。第二个函数subtotal 在计算上很简单,除了它使用第一个函数的返回值,因此也变得计算量很大,因为它当前需要重新调用total 来获得它的返回结果。
我想缓存第一个函数的结果并将其用作第二个函数的输入,如果输入 y 到 subtotal 将输入 x 共享给最近的通话的total。那就是:
- 如果调用 subtotal(),其中
y等于 a
中x的值total的先前调用,然后使用该缓存结果而不是
重新调用total。 - 否则,只需使用
x = y调用total()。
例子:
class MyObject(object):
def __init__(self, a, b):
self.a, self.b = a, b
def total(self, x):
return (self.a + self.b) * x # some time-expensive calculation
def subtotal(self, y, z):
return self.total(x=y) + z # Don't want to have to re-run total() here
# IF y == x from a recent call of total(),
# otherwise, call total().
【问题讨论】:
-
你试过这个吗:stackoverflow.com/a/18723434/2570677。我已经在我的代码中使用了它,它运行良好。
-
假设你指的是
@functools.lru_cache? -
从您链接到的资源中,是什么阻止您仅使用基本缓存功能装饰
total?您只需输入@functools.lru_cache(maxsize=N),它就会缓存N相同参数的结果。为什么这在您的场景中不起作用? -
@BradSolomon 我指的是包含实现的答案(没有任何外部模块)。它适用于 python 2.7。
标签: python-3.x caching memoization