Smart猫小萌
从Python 3.2开始,有一个内置的装饰器:@functools.lru_cache(maxsize=100, typed=False)Decorator用一个memoizing callable来包装一个函数,它可以节省maxsize最近的调用。当使用相同的参数定期调用昂贵的或I / O绑定函数时,它可以节省时间。用于计算Fibonacci数的LRU高速缓存示例:@lru_cache(maxsize=None)def fib(n):
if n < 2:
return n return fib(n-1) + fib(n-2)>>> print([fib(n) for n in range(16)])[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]>>> print(fib.cache_info())CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)如果你坚持使用Python 2.x,这里有一个其他兼容的memoization库列表:functools32| PyPI | 源代码repoze.lru| PyPI | 源代码pylru| PyPI | 源代码backports.functools_lru_cache| PyPI | 源代码
交互式爱情
class memorize(dict):
def __init__(self, func):
self.func = func def __call__(self, *args):
return self[args]
def __missing__(self, key):
result = self[key] = self.func(*key)
return result样品用途:>>> @memorize... def foo(a, b):... return a * b>>> foo(2, 4)8>>> foo{(2, 4): 8}>>> foo('hi', 3)'hihihi'>>> foo{(2, 4): 8, ('hi', 3): 'hihihi'}