0

0

Python函数缓存机制_lru_cache应用说明【指导】

冰川箭仙

冰川箭仙

发布时间:2026-01-04 18:43:15

|

347人浏览过

|

来源于php中文网

原创

@lru_cache适用于纯函数的性能优化,基于lru策略缓存结果;需满足参数可哈希、无副作用、不依赖外部状态,并合理设置maxsize以防内存膨胀。

python函数缓存机制_lru_cache应用说明【指导】

@lru_cache 是 Python 标准库 functools 中提供的轻量级函数结果缓存装饰器,适用于**纯函数**(即相同输入总返回相同输出、无副作用)的性能优化场景。它基于最近最少使用(LRU)策略管理缓存,避免重复计算,尤其对递归、高频调用或耗时计算类函数效果显著。

什么时候该用 @lru_cache?

以下情况建议启用:

  • 函数被频繁调用,且参数组合有限(如斐波那契数列、树形结构遍历、解析固定格式字符串)
  • 函数内部有较重计算(如数值迭代、小规模查表、正则匹配预处理)但不涉及 I/O、全局状态或随机性
  • 你已确认函数是纯的——不修改外部变量、不依赖时间/文件/网络等外部状态
  • 内存可控:缓存容量默认不限(maxsize=None),但实际应设合理上限(如 @lru_cache(maxsize=128))防止内存膨胀

基础用法与常见配置

最简写法:

  from functools import lru_cache
  
  @lru_cache()
  def fib(n):
    if n
      return n
    return fib(n-1) + fib(n-2)

立即学习Python免费学习笔记(深入)”;

Play.ht
Play.ht

根据文本生成多种逼真的语音

下载

关键参数说明:

  • maxsize:缓存最大条目数。设为 None 表示无限制;设为整数(如 128)启用 LRU 驱逐;设为 0 相当于禁用缓存(仅用于调试开关)
  • typed:是否区分参数类型(如 fib(1)fib(1.0) 是否视为不同调用)。默认 False;设为 True 可提升类型敏感场景的准确性,但略增开销

必须注意的限制和陷阱

@lru_cache 不是万能加速器,踩坑点包括:

  • 不可缓存可变参数:若函数接受 listdict 等可变对象作为参数,会直接报 TypeError: unhashable type解决方法是转成 tuplefrozenset,或改用其他缓存方案(如 functools.cached_property 或手动字典缓存)
  • 不跟踪内部状态变化:若函数依赖外部变量(如全局计数器、配置字典),缓存结果可能过期却不会自动更新
  • 线程安全但非进程安全:同一进程中多线程共享缓存,但多进程间不共享——需用 multiprocessing.Manager 或 Redis 等外部缓存替代
  • 无法缓存异常:抛出异常的调用不会被缓存,每次都会重新执行

查看和管理缓存状态

装饰后函数会新增两个实用方法:

  • func.cache_info():返回命名元组 CacheInfo(hits, misses, maxsize, currsize),可用于监控命中率
  • func.cache_clear():清空当前缓存,适合在配置变更、数据刷新后手动重置

例如:
  print(fib.cache_info())  # CacheInfo(hits=98, misses=10, maxsize=128, currsize=10)
  fib.cache_clear()

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1188

2024.03.22

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

46

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号