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

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 nameabc('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.lryc.cn/news/234275.html

相关文章:

  • Swift制作打包framework
  • 无线WiFi安全渗透与攻防(N.2)WPA渗透-使用airolib-ng创建彩虹表加速
  • 整形数据和浮点型数据在内存中的存储差别
  • 【Python基础篇】运算符
  • 开启数据库审计 db,extended级别或os级别)并将审计文件存放到/opt/oracle/audit/下
  • 02.webpack中多文件打包
  • IEEE Standard for SystemVerilog Chapter 22. Compiler directives
  • 机器学习中的独立和同分布 (IID):假设和影响
  • PTP软硬件时间戳
  • 使用ADS进行serdes仿真时,Tx_Diff中EQ的设置对发送端波形的影响。
  • 数据库迁移(DBeaver版本)
  • 【c++STL常见排序算法sort,merge,random_shuffle,reverse】
  • STM32/N32G455国民科技芯片驱动DS1302时钟---笔记
  • 基于PLC的污水厌氧处理控制系统(论文+源码)
  • Unity之NetCode多人网络游戏联机对战教程(9)--NetworkAnimator组件
  • iceoryx之Roudi
  • .Net(C#)常用转换byte转uint32、byte转float等
  • windows快捷方式图标变成空白
  • 【Linux系统编程十九】:(进程通信)--匿名管道/模拟实现进程池
  • 【全网首发】2023年NOIP真题
  • 【Linux网络】从原理到实操,感受PXE无人值守自动化高效批量网络安装系统
  • Pandas+Matplotlib 数据分析
  • k8s ingress高级用法一
  • C语言--从键盘输入10个数字放在数组中,并输出
  • SSL加密
  • 一个美观且功能丰富的 .NET 控制台应用程序开源库
  • DispatcherSynchronizationContext and Dispatcher
  • java类型属性set方法无法被赋值
  • 【2】SM2验签工具和RSA验签工具
  • Python (十一) 迭代器与生成器