Python 中的 LRU Cache 详解
在 Python 开发中,LRU Cache(Least Recently Used Cache,最近最少使用缓存)是一种非常高效的缓存策略,它通过记录数据的访问顺序,当缓存空间达到上限时,优先剔除最长时间未被访问的数据,从而为新数据腾出空间。
在 Python 中,我们主要通过标准库 functools 模块中的 @lru_cache 装饰器来实现这一功能。
核心原理
LRU 算法的核心思想是:如果一个数据最近被访问过,那么它在未来被访问的可能性也更高。
通过这种机制,程序可以极大地减少重复执行高耗时函数(如复杂的数学计算、数据库查询或网络请求)的次数,从而显著提升程序性能。
如何使用 @lru_cache
使用方法非常简单,只需在目标函数上方添加装饰器即可。
基本语法
from functools import lru_cache
@lru_cache(maxsize=128, typed=False)
def my_function(arg):
# 执行耗时操作
return result
参数详解
maxsize:- 指定缓存的最大条目数。
- 默认为 128。
- 如果设置为
None,则缓存将无限增长,不再进行剔除操作。 - 建议设置为 2 的幂次方(如 64, 128, 256),这在底层实现上效率更高。
typed:- 默认为
False。 - 如果设置为
True,函数会将不同的参数类型视为不同的调用。 - 在
typed=True时,f(3)和f(3.0)会被分别缓存;而在typed=False时,它们会被视为同一个调用。
- 默认为
代码示例:优化斐波那契数列
斐波那契数列的递归实现具有大量的重复计算,使用 LRU Cache 可以将其复杂度从指数级降低到线性级。
from functools import lru_cache
import time
# 使用 lru_cache 装饰器
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
# 测试性能
start = time.time()
print(f"结果: {fibonacci(35)}")
end = time.time()
print(f"耗时: {end - start:.6f} 秒")
缓存管理工具
@lru_cache 装饰器不仅提供了缓存功能,还为原函数添加了两个非常有用的辅助方法:
cache_info():
返回一个命名元组,显示缓存的统计信息:hits: 缓存命中次数。misses: 缓存未命中次数(即实际执行函数的次数)。maxsize: 设置的最大容量。currsize: 当前缓存中的条目数。
cache_clear():
用于手动清空缓存,让函数重新开始计算。
# 查看缓存状态 print(fibonacci.cache_info()) # 清空缓存 fibonacci.cache_clear()
使用注意事项与最佳实践
为了确保使用 lru_cache 不会引发 Bug 或内存问题,请务必遵循以下原则:
- 参数必须是可哈希的 (Hashable):
由于缓存是通过参数作为字典的键(Key)来实现的,因此函数的参数必须是不可变对象(如int,str,tuple),如果你尝试传入list或dict,程序会抛出TypeError。 - 函数必须是“纯函数” (Pure Function):
缓存的函数不应该有副作用(Side Effects),如果函数依赖于外部全局变量,或者函数执行过程中会修改外部状态,那么缓存会导致程序逻辑与预期不符,因为缓存返回的是旧的“快照”值。 - 警惕内存溢出:
如果将maxsize设置为None,且函数的参数空间非常巨大,缓存可能会消耗掉系统所有的内存,在处理大规模数据时,务必设置一个合理的maxsize。 - 适用场景:
- 计算密集型任务(如数学运算)。
- 具有相同输入、相同输出且耗时的 IO 密集型任务(如读取配置文件)。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/491353.html



