@lru_cache是functools中轻量级函数缓存工具,基于lru策略管理缓存,要求参数可哈希、函数为纯函数;支持maxsize设置、cache_info查看和cache_clear清空,注意类方法、递归及关键字参数顺序问题。

@lru_cache 是 Python 标准库 functools 中最常用、最轻量的函数级缓存工具,适合优化纯函数(输入相同则输出确定)的重复调用。它基于最近最少使用(LRU)策略自动管理缓存大小,无需手动维护,但用法和限制需注意。
基础用法:加装饰器即可启用
只需在函数定义前加上 @lru_cache()(括号不能省),函数首次调用结果会被缓存,后续相同参数调用直接返回缓存值:
from functools import lru_cache <p>@lru_cache() def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2)</p><p>print(fibonacci(35)) # 首次较慢,之后极快
- 不带参数时等价于
@lru_cache(maxsize=128),默认最多缓存 128 组参数结果 - 设为
@lru_cache(maxsize=None)表示无容量限制(全量缓存,慎用) - 设为
@lru_cache(maxsize=0)则禁用缓存(仅用于临时关闭调试)
缓存生效的前提条件
@lru_cache 只对满足以下条件的函数有效:
95Shop可以免费下载使用,是一款仿醉品商城网店系统,内置SEO优化,具有模块丰富、管理简洁直观,操作易用等特点,系统功能完整,运行速度较快,采用ASP.NET(C#)技术开发,配合SQL Serve2000数据库存储数据,运行环境为微软ASP.NET 2.0。95Shop官方网站定期开发新功能和维护升级。可以放心使用! 安装运行方法 1、下载软件压缩包; 2、将下载的软件压缩包解压缩,得到we
- 参数必须是可哈希类型(如 int、str、tuple),列表、字典、集合等不可哈希对象会直接报错
- 函数必须是纯函数:不依赖外部状态(如全局变量、文件、时间),也不产生副作用(如修改入参、写日志)
- 同一组参数每次调用必须返回相同结果;若函数内含
random.random()或time.time(),缓存将导致逻辑错误
查看与管理缓存状态
每个被装饰的函数自带几个实用属性和方法,便于监控和调试:
立即学习“Python免费学习笔记(深入)”;
-
func.cache_info()返回命名元组:CacheInfo(hits=xx, misses=xx, maxsize=xx, currsize=xx) -
func.cache_clear()手动清空当前函数全部缓存(例如配置变更后重置) - 缓存键由参数的
hash()值生成,因此(1, 2)和[1, 2]不可混用——后者根本无法缓存
常见避坑提示
实际使用中容易忽略的关键点:
- 类方法上慎用:实例方法默认含
self参数,若self是不可哈希对象(如普通 class 实例),会触发TypeError - 递归函数可用,但要注意缓存粒度——每层递归调用都会独立缓存,深度大时内存占用可能明显
- 线程安全:@lru_cache 是线程安全的,多线程并发调用同一函数不会导致缓存损坏
- 不支持关键字参数顺序变化:
f(a=1, b=2)和f(b=2, a=1)被视为不同调用(因参数名参与哈希)









