lru 缓存
可以使用 @lru_cache
装饰器使用最近最少使用的缓存来包装昂贵的,计算密集型的功能。这允许对函数调用进行记忆,以便具有相同参数的未来调用可以立即返回,而不必重新计算。
@lru_cache(maxsize=None) # Boundless cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
>>> fibonacci(15)
在上面的示例中,fibonacci(3)
的值仅计算一次,而如果 fibonacci
没有 LRU 缓存,则 fibonacci(3)
将被计算超过 230 次。因此,@lru_cache
特别适用于递归函数或动态编程,其中可以使用相同的精确参数多次调用昂贵的函数。
@lru_cache
有两个论点
maxsize
:保存的呼叫数。当唯一呼叫的数量超过maxsize
时,LRU 缓存将删除最近最少使用的呼叫。typed
(在 3.3 中添加):用于确定不同类型的等效参数是否属于不同缓存记录的标志(即,如果3.0
和3
计为不同的参数)
我们也可以看到缓存统计信息:
>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)
注意 :由于 @lru_cache
使用字典来缓存结果,因此该函数的所有参数都必须是可清除的,以使缓存起作用。
官方 Python 文档为 @lru_cache
。@lru_cache
在 3.2 中添加。