@lru_cache缓存失效时机包括参数哈希不一致、lru容量驱逐、手动clear、解释器重启或函数重定义;不可哈希参数报错,类型差异视为不同调用,外部状态变更不自动失效。

Python函数缓存(如 @lru_cache)不是永久有效的,它的失效时机取决于缓存策略、参数变化、内存压力以及手动干预。理解何时失效,才能避免因缓存陈旧导致的逻辑错误或资源浪费。
参数不变时缓存有效,但类型或值细微差异即失效
@lru_cache 默认基于函数调用的参数进行哈希比对,要求所有参数可哈希(如 int、str、tuple),且哈希值完全一致才命中缓存。
- 同一数值但类型不同:
func(1)和func(1.0)视为不同调用,不共享缓存 - 可变对象无法缓存:传入
list或dict会直接报错(TypeError: unhashable type) - 自定义类实例需明确定义
__hash__和__eq__,否则默认按内存地址判别,两次构造相同内容的实例也不会命中缓存
缓存容量满或访问频次低时自动淘汰
@lru_cache(maxsize=N) 使用最近最少使用(LRU)策略管理缓存项:
- 当缓存条目数超过
maxsize,最久未被调用的条目会被移除 -
maxsize=None表示无上限,但实际仍受内存限制;长时间运行可能引发内存增长 -
maxsize=128(默认值)适合多数轻量场景,高频多参数组合下易频繁驱逐,需根据调用分布调整
显式清除或全局状态变更导致缓存失效
缓存本身不感知外部数据变化,但可通过以下方式主动控制:
立即学习“Python免费学习笔记(深入)”;
- 调用
func.cache_clear()清空全部缓存(适用于配置重载、数据库切换等场景) - 修改函数内部引用的全局变量或闭包变量,不会自动使缓存失效——这是常见误区,需开发者自行协调(例如配合
cache_clear()) - 多线程/多进程环境下,
@lru_cache缓存不共享,每个线程有独立缓存;若需跨线程一致性,应改用线程安全的外部缓存(如functools.cached_property配合锁,或 Redis)
Python解释器重启或函数重定义即彻底失效
缓存是内存中的字典,生命周期绑定于函数对象:
- 交互式环境(如 IPython/Jupyter)中重定义函数,原缓存自动丢失
- 热更新代码或 reload 模块后,新函数对象与旧缓存无关
- 序列化缓存(如用
pickle)不可行——lru_cache的缓存结构未暴露为可序列化对象
缓存是性能优化手段,不是状态管理机制。是否启用、如何配置、何时清理,需结合函数纯度、参数特征和运行环境综合判断。










