当前位置: 首页 > article >正文

Python 的 @lru_cache() 装饰器

在 Python 标准库的 functools 模块中,有个 lru_cache 装饰器,用于为一个函数添加缓存系统:

  • 存储函数的输入和对应的输出
  • 当函数被调用,并且给出了已经缓存过的输入,那么函数不会再运行,而是直接从缓存中获取对应的输出
  • 有两个可选参数
    • maxsize 设置缓存的大小,设置后,缓存的大小就会被限制在这个值之内(缓存默认没有上限)
      • 当缓存达到上限时,最近最少使用的缓存会被移除
    • typed 如果设置为 True 后,会根据输入参数的类型分别进行缓存(默认是 False 即不分类型)
      • 例如 11.0 尽管在 Python 中是相等的,但是会被当成两个不同的输入进行缓存
  • 有两个方法用于清理和查看缓存
    • cache_clear() 清空所有的缓存
    • cache_info() 返回一个包含缓存状态的命名元组,包含以下几个字段
      • hits 缓存命中的次数
      • misses 缓存未命中的次数
      • maxsize 缓存的最大容量
      • currsize 当前缓存的使用量

本质上,这个 lru_cache 装饰器是通过空间换取时间的方式来提高程序的性能,所以 lru_cache 装饰器并不适合所有的场景:

  • 合适的场景
    • 具有重复计算的递归函数
    • 计算成本较高的函数
    • 计算密集型或者需要大量重复计算的函数
  • 不合适的场景
    • 函数运行在内存有限的环境中
    • 函数有大量的不同输入
    • 函数有副作用,或者依赖于外部状态

通过下面的例子可以很好的理解 @lru_cache() 的用法:

from functools import lru_cache

@lru_cache()
def abc(name: str):
    print(f'缓存 name = {name}')
    return name

abc('1')
# 缓存 name = 1
# '1'

abc('2')
# 缓存 name = 2
# '2'

abc('3')
# 缓存 name = 3
# '3'

abc('1')
abc('2')
abc('3')
# '1'
# '2'
# '3'

abc.cache_info()
# CacheInfo(hits=3, misses=3, maxsize=128, currsize=3)

abc('3')
# '3'
abc.cache_info()
# CacheInfo(hits=4, misses=3, maxsize=128, currsize=3)

abc.cache_clear()
abc.cache_info()
# CacheInfo(hits=0, misses=0, maxsize=128, currsize=0)

http://www.kler.cn/a/132485.html

相关文章:

  • 5.4.2-1 编写Java程序在HDFS上创建文件
  • 一文了解 inductive bias(归纳偏好)
  • thinkphp6 入门(2)--视图、渲染html页面、赋值
  • 通过华为鲲鹏认证发行上市的集成平台产品推荐
  • css 使用图片作为元素边框
  • 前端基础(四十一):实时获取麦克风音量
  • uniapp开发ios上线(在win环境下使用三方)
  • c#Nettonsoft.net库常用的方法json序列化反序列化
  • docker 部署mysql主从复制
  • ffmpeg和ffplay
  • Postgresql删除表或者序列时报SQL 错误 [2BP01]
  • 单元测试实战(五)普通类的测试
  • 合成事件在san.js中的应用
  • 单元测试实战(二)Service 的测试
  • Android Jetpack的组件介绍,常见组件解析
  • 力扣labuladong一刷day12拿下N数之和问题共4题
  • 一文搞懂设计模式之代理模式
  • AIGC创作系统ChatGPT源码,AI绘画源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图
  • “开源 vs. 闭源:大模型的未来发展趋势预测“——探讨大模型未来的发展方向
  • 2023版Idea创建JavaWeb时,右键new没有Servlet快捷键选项
  • Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)
  • 电子画册真的好好用,制作也简单,都快来学学!
  • Springboot集成JDBC
  • V100 配置 Scanpy + Scvi + Pytorch
  • 快速搜索多个word、excel等文件中内容
  • Element UI 偶发性图标乱码问题