CodeWalk

functools.lru_cache与cache装饰器的缓存机制

作者:Yahuda · 2026-05-30 12:55

请详细解释@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,则区分11.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()清空缓存。