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.03 计为不同的参数)

我们也可以看到缓存统计信息:

>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)

注意 :由于 @lru_cache 使用字典来缓存结果,因此该函数的所有参数都必须是可清除的,以使缓存起作用。

官方 Python 文档为 @lru_cache@lru_cache 在 3.2 中添加。