@lru_cache是functools中基于LRU策略的轻量函数缓存工具,适用于纯函数、递归、参数有限且无I/O或状态依赖的场景;需参数可哈希,支持maxsize和typed参数,可通过cache_info和cache_clear监控管理。

@lru_cache 是 Python 标准库 functools 中最常用、最轻量的函数结果缓存工具。它基于最近最少使用(LRU)策略,自动记住函数的输入与输出,避免重复计算,特别适合纯函数(无副作用、相同输入恒得相同输出)。
什么时候该用 @lru_cache?
以下情况加缓存效果明显:
- 递归函数(如斐波那契、阶乘),重复子问题多
- 计算开销大但调用频繁、参数范围有限的函数(如解析固定配置、查表转换)
- 纯数学/字符串处理函数(如校验码生成、格式化逻辑)
- 不涉及 I/O、全局状态、时间依赖或随机性的函数
⚠️ 注意:含 list、dict 等可变类型作参数会报错(因不可哈希),需先转成 tuple 或用 frozenset;含关键字参数也支持,但所有参数必须可哈希。
基础用法与参数控制
最简写法:
立即学习“Python免费学习笔记(深入)”;
from functools import lru_cache@lru_cache() def fib(n): return n if n < 2 else fib(n-1) + fib(n-2)
关键参数:
数据本地化解决接口缓存数据无限增加,读取慢的问题,速度极大提升更注重SEO优化优化了系统的SEO,提升网站在搜索引擎的排名,增加网站爆光率搜索框本地化不用远程读取、IFRAME调用,更加容易应用及修改增加天气预报功能页面增加了天气预报功能,丰富内容增加点评和问答页面增加了点评和问答相关页面,增强网站粘性电子地图优化优化了电子地图的加载速度与地图功能酒店列表增加房型读取酒店列表页可以直接展示房型,增
-
maxsize=128(默认值):最多缓存 128 组参数组合;设为None表示无上限(慎用,防内存泄漏) -
typed=False:是否区分参数类型(如fib(1)和fib(1.0)是否算不同调用);设为True可提升类型敏感场景准确性
推荐显式声明,增强可读性与可控性:
@lru_cache(maxsize=512, typed=True)
def parse_version(tag: str) -> tuple:
...
查看与管理缓存状态
缓存不是黑盒,可通过函数属性实时观测:
-
func.cache_info():返回命名元组CacheInfo(hits, misses, maxsize, currsize),用于监控命中率 -
func.cache_clear():清空当前缓存(适合配置变更、测试重置等场景)
示例:
print(fib.cache_info()) # CacheInfo(hits=142, misses=10, maxsize=128, currsize=10) fib.cache_clear()
常见陷阱与替代思路
别让缓存成为 bug 源头:
- 类方法上直接加
@lru_cache会把self当参数缓存——导致不同实例共享结果。应改用@lru_cache+ 实例属性,或用cached_property(Python 3.8+) - 带默认参数的函数,若默认值是可变对象(如
def f(x, lst=[])),缓存可能意外复用该对象,引发逻辑错误 - 需要更灵活缓存策略(如 TTL 过期、按条件刷新)时,考虑
functools.cached_property、dogpile.cache或简单手动字典 + 时间戳
缓存不是银弹,合理评估「计算耗时 vs 缓存开销 vs 内存占用」三者平衡点,比盲目添加更重要。










