首页 关于我们 成功案例 网络营销 电商设计 新闻中心 联系方式
QQ联系
电话联系
手机联系
QQ联系
电话联系
手机联系

Python函数缓存策略_lru_cache应用解析【教程】

发布时间:2026-01-02 00:00
发布者:冰川箭仙
浏览次数:
@lru_cache是functools中基于LRU策略的函数缓存装饰器,适用于纯函数、可哈希参数、计算开销大且调用频繁的场景;支持maxsize控制容量、typed启用类型敏感缓存,并提供cache_info和cache_clear等管理接口。

@lru_cache 是 Python 标准库 functools 中最常用、最实用的函数缓存装饰器。它通过“最近最少使用”(LRU)策略自动缓存函数的返回值,避免重复计算,显著提升重复调用场景下的性能——尤其适合纯函数、参数可哈希、计算开销大的场景。

什么时候该用 @lru_cache?

不是所有函数都适合加缓存。以下情况推荐启用:

  • 函数是纯函数:相同输入必得相同输出,不依赖外部状态(如全局变量、文件、网络)
  • 参数全部是可哈希类型(如 int/str/tuple,不能是 list/dict/set 等不可哈希对象)
  • 函数执行较慢(如递归计算、数值模拟、字符串解析),且被高频重复调用
  • 内存可控:缓存容量不会随输入规模无限制增长(可通过 maxsize 限制)

基础用法与关键参数

直接在函数上方添加 @lru_cache 即可启用默认缓存(maxsize=128):

示例:优化斐波那契递归

from functools import lru_cache

@lru_cache() def fib(n): if n < 2: return n return fib(n-1) + fib(n-2)

print(fib(35)) # 原本可能卡顿,加缓存后毫秒级返回

常用参数说明:

  • @lru_cache(maxsize=128):最多缓存 128 组输入-输出对;设为 None 表示无上限(慎用)
  • @lru_cache(maxsize=0):禁用 LRU 缓存,但会记录调用统计(cache_info() 仍可用)
  • typed=True:开启类型敏感缓存(如 fib(1)fib(1.0) 视为不同调用)

查看与管理缓存状态

缓存行为可观察、可调试:

  • fib.cache_info() 返回命名元组:CacheInfo(hits=..., misses=..., maxsize=..., currsize=...)
  • fib.cache_clear() 手动清空当前函数的所有缓存(适合数据更新后重置)
  • 多次调用同一参数时,hits 增加,说明缓存生效

常见陷阱与规避方法

用错地方反而引发 bug 或内存泄漏:

  • 可哈希参数报错:传入 list/dict → 改用 tuple 或 frozenset 包装,或改用其他缓存方案(如手动 dict 缓存 + 自定义 key)
  • 副作用函数误缓存:含 print / 写文件 / 修改全局变量的函数,加缓存会导致后续调用跳过副作用 → 切勿装饰
  • 内存持续增长maxsize=None 且输入组合极多 → 显式设置合理 maxsize,或定期 cache_clear()
  • 类方法缓存失效:普通装饰器无法缓存实例方法(因 self 导致每次调用 key 不同)→ 改用 @lru_cache 在静态方法或工具函数上,或使用 methodtools.lru_cache 等扩展


# python  # 工具  # python函数  # 字符串解析  # 标准库 


相关文章: html5 plus怎么调用_HTML5 Plus在HBuilder中调用扫码拍照等原生API【调用】  得物卖家手续费怎么算_得物出售商品技术服务费与扣点细则  如何在 Vue 3 中正确传递和使用 props(含模板语法与注意事项)  猎豹浏览器历史记录怎么查看删除 猎豹浏览器浏览记录管理【步骤】  Python闭包与作用域详解教程_变量捕获与实践案例  C++如何使用std::bind和占位符?(函数封装)  composer如何配置本地path仓库进行包开发_composer本地路径依赖映射【技巧】  搭载双2亿镜头!6.3英寸小屏旗舰工程机满配暴击  composer怎么安装MongoDB扩展包_composer引入PHP-MongoDB官方驱动【实操】  布里奇特女船长战斗手册:小怪清空是关键  2026换新机认准“骁龙8”!这份国补购机指南快收好  Windows10如何删除Windows.old_Win10磁盘清理系统文件选项  Python并发任务拆分_负载均衡说明【指导】  如何在Golang中操作嵌套指针_Golang多级指针访问与修改  jimdo怎么插入html5画布_jimdo画布html5标签添加与绘制基础【步骤】  UC浏览器如何关闭自动播放视频 UC浏览器视频自动播放设置  腾讯混元开源 HY-Motion1.0,10 亿参数文生 3D 动作大模型  如何在 React 中使用 AG Grid 实现行列转置(Transpose)  联想moto X70 Air Pro AI手机即将发布:让影像拥有思考  如何为不同团队 ID 动态生成多个非值班状态按钮  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Windows11怎样设置系统闹钟_Windows11系统闹钟设置步骤【教程】  红色沙漠测评:展现了灵活多变富有各种形态的玩法  最强祖师龙傲天四阶法宝锻造及本命养成  最后的中高端LCD手机?机身重255g 电池5000mAh  僵尸X赛车X肉鸽!超爽游戏《恶煞车手:Rogue Shift》首爆实机预告  php订单日志怎么记录积分变动_php记录订单积分变化日志说明【说明】  Win11怎么关闭自动维护 Win11禁用系统自动维护功能【优化】  css float 属性现在还有用吗_旧布局方式适用场景分析  VSCode的AsciiDoc:比Markdown更强大的文档编写语言 


相关栏目: 【 行业资讯17850 】 【 软件资源51899 】 【 网站技术89748 】 【 百度推广44206 】 【 网络营销84187 】 【 运营推广93002 】 【 AI优化91086 】 【 网络优化117696 】 【 网址导航107142