Python函数缓存教程_lru_cache性能优化
发布时间 - 2026-01-12 00:00:00 点击率:次@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;含关键字参数也支持,但所有参数必须可哈希。
基础用法与参数控制
最简写法:
from functools import lru_cache@lru_cache() def fib(n): return n if n < 2 else fib(n-1) + fib(n-2)
关键参数:
-
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 内存占用」三者平衡点,比盲目添加更重要。
# python
# 工具
# 递归函数
# python函数
# 内存占用
# 标准库
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
如何在阿里云购买域名并搭建网站?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
简单实现jsp分页
iOS中将个别页面强制横屏其他页面竖屏
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
网站制作软件免费下载安装,有哪些免费下载的软件网站?
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
Laravel集合Collection怎么用_Laravel集合常用函数详解
Swift中循环语句中的转移语句 break 和 continue
如何在云主机上快速搭建网站?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Linux网络带宽限制_tc配置实践解析【教程】
如何在Windows 2008云服务器安全搭建网站?
深入理解Android中的xmlns:tools属性
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Thinkphp 中 distinct 的用法解析
手机软键盘弹出时影响布局的解决方法
如何在Windows环境下新建FTP站点并设置权限?
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
如何为不同团队 ID 动态生成多个独立按钮
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
Linux安全能力提升路径_长期防护思维说明【指导】
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何在建站主机中优化服务器配置?
如何在阿里云部署织梦网站?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
php 三元运算符实例详细介绍
Android 常见的图片加载框架详细介绍
香港服务器租用每月最低只需15元?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
公司门户网站制作流程,华为官网怎么做?
Laravel distinct去重查询_Laravel Eloquent去重方法
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
如何基于云服务器快速搭建网站及云盘系统?
网站建设保证美观性,需要考虑的几点问题!
网站制作壁纸教程视频,电脑壁纸网站?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
node.js报错:Cannot find module 'ejs'的解决办法
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】


b.cache_clear()