functools.lru_cache与cache装饰器的缓存机制
请详细解释@functools.lru_cache和@functools.cache(Python 3.9+)的缓存机制、参数含义以及适用场景,并举一个斐波那契数列优化的例子。
回答
Yahuda
@functools.lru_cache(maxsize=128, typed=False):
- 基于LRU(Least Recently Used)算法的缓存装饰器
maxsize:最大缓存条目数,maxsize=None表示无限制;达到上限时淘汰最近最少使用的typed=False:若为True,则区分1和1.0为不同缓存键- 缓存命中时直接返回结果,避免重复计算
@functools.cache(Python 3.9+):
- 等同于
lru_cache(maxsize=None),无限制缓存 - 更简洁,适合缓存永不淘汰的场景
斐波那契优化示例:
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
# 未缓存时fib(40)需数十秒,缓存后瞬间返回
print(fib(100)) # 354224848179261915075
注意事项:函数参数必须是可哈希的(hashable),且函数应为纯函数(无副作用)。可通过.cache_info()查看命中率,.cache_clear()清空缓存。