请稍侯

Python-memoize

28 August 2015

代码记忆是一种避免潜在的重复计算开销的方法。你通过缓存一个函数每次运行的结果来达到此目的。 这样,下一次函数以同样的参数运行时,它将从缓存中返回结果,并不需要花费额外的时间来计算结果。

一个简单的例子

factorial_memo = {}
def factorial(k):
    if k < 2: return 1
    if not k in factorial_memo:
        factorial_memo[k] = k * factorial(k-1)
    return factorial_memo[k]

通过factorial_memo这个dict来缓存结果.计算factorial(k)如果k已经计算过,在factorial_memo中会有缓存,直接返回

用类实现

class Memoize:
    def __init__(self, f):
        self.f = f
        self.memo = {}
    def __call__(self, *args):
        if not args in self.memo:
            self.memo[args] = self.f(*args)
        return self.memo[args]
        
def factorial(k):
    if k < 2: return 1
    return k * factorial(k - 1)

factorial = Memoize(factorial)

用装饰器实现

from functools import wraps

def memoize(func):
    cache = {}
    @wraps(func)
    def wrapper(k):
        if k not in cache:
            cache[k] = func(k)
        return cache[k]
    return wrapper
 
@memoize
def factorial(k):
    if k < 2: return 1
    return k * factorial(k - 1)