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、全局状态、时间依赖或随机性的函数

⚠️ 注意:含 listdict 等可变类型作参数会报错(因不可哈希),需先转成 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_propertydogpile.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 &#39;ejs&#39;的解决办法  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】