Python函数缓存机制_lru_cache解析【指导】
技术百科
舞姬之光
发布时间:2026-01-01
浏览: 次 @lru_cache是functools中基于LRU策略的内存缓存装饰器,要求参数可哈希且函数为纯函数;支持maxsize控制容量,提供cache_info和cache_clear等管理方法。
@lru_cache 是 Python 标准库 functools 中提供的一个装饰器,用于为函数结果做内存缓存,避免重复计算,特别适合纯函数(相同输入总返回相同输出、无副作用)。
缓存原理与触发条件
它基于“最近最少使用”(LRU)策略管理缓存:当缓存满时,自动淘汰最久未被调用的条目。只有满足以下条件才会命中缓存:
- 函数调用参数完全一致(包括顺序、类型、值);
- 参数必须是可哈希的(如 int、str、tuple,但 list、dict 不行);
- 函数未被重新定义或重载(缓存绑定在函数对象上)。
基本用法与常用参数
最简写法:@lru_cache(),启用默认缓存(最大容量 128,不设上限)。更常见的写法是显式控制大小:
-
@lru_cache(maxsize=128):限制最多缓存 128 组输入输出; -
@lru_cache(maxsize=None):不限制大小,适合参数组合有限且确定的场景; -
@lru_cache(maxsize=0):禁用缓存(仅用于调试或临时关闭)。
查看与管理缓存状态
装饰后函数会新增三个实用方法和属性:
-
func.cache_info():返回命名元组CacheInfo(hits, misses, maxsize, currsize),用于监控命中率; -
func.cache_clear():清空当前所有缓存,适合数据源更新后重置; - 缓存键由
hash(args生成,因此需确保参数可哈希。
) + hash(kwargs.items())
典型适用与慎用场景
适合:递归计算(如斐波那契)、IO 不敏感的数值转换、配置解析、固定查询逻辑;
慎用:含时间/随机/全局状态的函数、参数含不可哈希对象(如 dict/list)、高并发下共享缓存可能引发一致性问题。
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么关闭用户账户控制UAC_Window
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- Windows服务无法启动错误1067是什么_进程
- 如何用正则表达式精确匹配最多含一个换行符的起止片段
- Win11怎么关闭SmartScreen_禁用Wi
- c++怎么编写动态链接库dll_c++ __dec
- Win10如何卸载预装Edge扩展_Win10卸载
- Windows10系统怎么查看显卡驱动_Win10
- 使用类变量定义字符串常量时的类型安全最佳实践
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- Mac自带的词典App怎么用_Mac添加和使用多语
- 如何在Golang中定义接口_抽象方法和多态实现
- Win11关机界面怎么改_Win11自定义关机画面
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- 如何在Golang中操作嵌套切片指针_Golang
- 如何在Golang中实现CI/CD流水线自动化测试
- 如何在 Go 中正确反序列化多个同级 XML 元素
- Win11怎么修复系统文件_使用sfc命令修复Wi
- php和redis连接超时怎么办_phpredis
- Win11怎么恢复出厂设置_Win11重置此电脑保
- Windows10电脑怎么连接蓝牙设备_Win10
- 如何在Golang中处理云原生事件_使用Event
- Go 语言标准库为何不提供泛型 Contains
- Windows如何拦截腾讯视频广告_Windows
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- Win11怎么退出微软账户_切换Win11为本地账
- Windows10无法连接到Internet_Wi
- c++的mutex和lock_guard如何使用
- ACF 教程:如何正确更新嵌套在多层 Group
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Go语言中正确反序列化多个同级XML元素为结构体切
- Windows家庭版如何开启组策略(gpedit.
- Windows蓝屏BAD_POOL_HEADER故
- php中$this和::能混用吗_对象与静态作用域
- Linux如何使用Curl发送请求_Linux下A
- MySQL 中使用 IF 和 CASE 实现查询字
- 如何在Golang中写入XML文件_生成符合规范的
- Windows10怎么用“讲述人”读屏辅助 Win
- 如何使用Golang实现基本类型比较_Golang
- Linux怎么修改用户密码_Linux系统pass
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- Windows如何拦截2345弹窗广告_Windo
- 如何在 Go 中高效缓存与分发网络视频流
- Win11怎么关闭定位服务 Win11禁止应用获取
- PythonFastAPI项目实战教程_API接口
- 本地php环境出现502错误_nginx或apac
- Mac版Final Cut Pro入门_Mac视频
- PythonGIL机制理解_多线程限制解析【教程】
- Win11怎么清理C盘OneDrive缓存_Win

) + hash(kwargs.items())
QQ客服