@lru_cache是functools中基于LRU策略的函数缓存装饰器,适用于纯函数、可哈希参数、计算开销大且调用频繁的场景;支持maxsize控制容量、typed启用类型敏感缓存,并提供cache_info和cache_clear等管理接口。

@lru_cache 是 Python 标准库 functools 中最常用、最实用的函数缓存装饰器。它通过“最近最少使用”(LRU)策略自动缓存函数的返回值,避免重复计算,显著提升重复调用场景下的性能——尤其适合纯函数、参数可哈希、计算开销大的场景。
什么时候该用 @lru_cache?
不是所有函数都适合加缓存。以下情况推荐启用:
- 函数是纯函数:相同输入必得相同输出,不依赖外部状态(如全局变量、文件、网络)
- 参数全部是可哈希类型(如 int/str/tuple,不能是 list/dict/set 等不可哈希对象)
- 函数执行较慢(如递归计算、数值模拟、字符串解析),且被高频重复调用
- 内存可控:缓存容量不会随输入规模无限制增长(可通过
maxsize限制)
基础用法与关键参数
直接在函数上方添加 @lru_cache 即可启用默认缓存(maxsize=128):
示例:优化斐波那契递归
立即学习“Python免费学习笔记(深入)”;
from functools import lru_cache@lru_cache() def fib(n): if n < 2: return n return fib(n-1) + fib(n-2)
print(fib(35)) # 原本可能卡顿,加缓存后毫秒级返回
常用参数说明:
-
@lru_cache(maxsize=128):最多缓存 128 组输入-输出对;设为None表示无上限(慎用) -
@lru_cache(maxsize=0):禁用 LRU 缓存,但会记录调用统计(cache_info()仍可用) -
typed=True:开启类型敏感缓存(如fib(1)和fib(1.0)视为不同调用)
查看与管理缓存状态
缓存行为可观察、可调试:
-
fib.cache_info()返回命名元组:CacheInfo(hits=..., misses=..., maxsize=..., currsize=...) -
fib.cache_clear()手动清空当前函数的所有缓存(适合数据更新后重置) - 多次调用同一参数时,
hits增加,说明缓存生效
常见陷阱与规避方法
用错地方反而引发 bug 或内存泄漏:
- 不可哈希参数报错:传入 list/dict → 改用 tuple 或 frozenset 包装,或改用其他缓存方案(如手动 dict 缓存 + 自定义 key)
- 副作用函数误缓存:含 print / 写文件 / 修改全局变量的函数,加缓存会导致后续调用跳过副作用 → 切勿装饰
-
内存持续增长:
maxsize=None且输入组合极多 → 显式设置合理maxsize,或定期cache_clear() -
类方法缓存失效:普通装饰器无法缓存实例方法(因
self导致每次调用 key 不同)→ 改用@lru_cache在静态方法或工具函数上,或使用methodtools.lru_cache等扩展










