@lru_cache适用于输入全为不可变类型、无外部依赖、重复调用多且计算开销大的纯函数;支持maxsize和typed参数,提供cache_info、cache_clear和__wrapped__等缓存管理功能。

@lru_cache 是 Python 标准库 functools 中提供的一个装饰器,用于为函数添加**最近最少使用(LRU)缓存**,避免重复计算,显著提升性能,尤其适合纯函数(相同输入总返回相同输出、无副作用)。
什么时候该用 @lru_cache?
适用于满足以下条件的函数:
- 输入参数全部是不可变类型(如 int、str、tuple),因为缓存键基于参数哈希;list、dict、set 等可变类型会直接报错。
- 函数逻辑稳定、无外部状态依赖(比如不读文件、不查数据库、不调用 time.time())。
- 存在大量重复调用且计算开销大(如递归斐波那契、解析固定字符串、数值计算等)。
基础用法与参数说明
最简写法:
from functools import lru_cache
@lru_cache()
def my_func(x, y):
return x ** y + x * y
常用参数:
系统优势: 1、 使用全新ASP.Net+c#和三层结构开发. 2、 可生成各类静态页面(html,htm,shtm,shtml和.aspx) 3、 管理后台风格模板自由选择,界面精美 4、 风格模板每月更新多套,还可按需定制 5、 独具的缓存技术加快网页浏览速度 6、 智能销售统计,图表分析 7、 集成国内各大统计系统 8、 多国语言支持,内置简体繁体和英语 9、 UTF-8编码,可使用于全球
立即学习“Python免费学习笔记(深入)”;
-
maxsize:缓存最大条目数,默认
128;设为 <code>None表示无限制(慎用,防内存泄漏)。 -
typed:是否区分参数类型,默认
False。设为True后,f(1)和f(1.0)被视为不同调用(因 int ≠ float)。
查看与管理缓存状态
装饰后函数会自带三个实用属性和方法:
-
my_func.cache_info():返回命名元组CacheInfo(hits, misses, maxsize, currsize),方便监控命中率。 -
my_func.cache_clear():清空当前缓存,适合在数据源更新后重置。 -
my_func.__wrapped__:访问原始未装饰函数,可用于测试或调试。
常见陷阱与注意事项
容易踩坑的地方:
- 类方法上直接加
@lru_cache会导致每个实例缓存独立,且 self 被当作参数参与哈希 —— 通常应改用@classmethod+@lru_cache,或用第三方库如cached_property。 - 带默认参数的函数会被正常缓存,但注意默认值若为可变对象(如
def f(x, lst=[])),本身就有风险,与缓存无关但易混淆。 - 多线程下
@lru_cache是线程安全的,但高并发时锁竞争可能影响性能,必要时考虑更轻量方案(如字典手动缓存 + threading.Lock)。









