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

【Python】一文向您详细解析内置装饰器 @lru_cache

【Python】一文向您详细解析内置装饰器 @lru_cache
 
下滑即可查看博客内容
在这里插入图片描述

🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇

🎓 博主简介985高校的普通本硕,曾有幸发表过人工智能领域的 中科院顶刊一作论文,熟练掌握PyTorch框架

🔧 技术专长: 在CVNLP多模态等领域有丰富的项目实战经验。已累计提供近千次定制化产品服务,助力用户少走弯路、提高效率,近一年好评率100%

📝 博客风采: 积极分享关于深度学习、PyTorch、Python相关的实用内容。已发表原创文章600余篇,代码分享次数逾七万次

💡 服务项目:包括但不限于科研辅导知识付费咨询以及为用户需求提供定制化解决方案

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

🌵文章目录🌵

  • 💡一、初识@lru_cache
  • 🎯二、深入理解@lru_cache
      • 2.1 缓存大小与淘汰策略
      • 2.2 类型敏感的缓存
      • 2.3 缓存的透明性
  • 🚀三、使用场景与示例
  • 🚀四、总结与展望

下滑即可查看博客内容

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

  

💡一、初识@lru_cache

  在Python中,当我们需要频繁地调用一个计算成本较高的函数,并且这些调用经常以相同的参数进行时,使用缓存策略可以显著提高性能。Python的functools模块提供了一个名为lru_cache的装饰器,它实现了最近最少使用(Least Recently Used, LRU)缓存策略。

首先,让我们来看看如何使用lru_cache装饰器:

from functools import lru_cache@lru_cache(maxsize=128)
def fibonacci(n):if n < 2:return nreturn fibonacci(n-1) + fibonacci(n-2)# 调用函数
print(fibonacci(10))  # 第一次计算并缓存结果
print(fibonacci(10))  # 直接从缓存中获取结果,不再计算

上面的代码中,fibonacci函数使用了lru_cache装饰器,这意味着该函数的结果会被缓存起来。当以相同的参数再次调用该函数时,它将直接从缓存中返回结果,而不是重新计算。

🎯二、深入理解@lru_cache

2.1 缓存大小与淘汰策略

lru_cache装饰器接受一个可选参数maxsize,它指定了缓存中可以存储的最大项数。当缓存达到其最大大小时,最久未使用的项将被淘汰以腾出空间。如果maxsize设置为None,则缓存大小没有限制(但请注意,这可能会导致内存占用无限增长)。

2.2 类型敏感的缓存

默认情况下,lru_cache装饰器将不同的参数视为不同的缓存键,即使这些参数的值相等但类型不同。如果你希望类型也作为缓存键的一部分,可以将typed参数设置为True

@lru_cache(maxsize=128, typed=True)
def power(base, exponent):return base ** exponentprint(power(2, 3))     # 缓存结果
print(power(2.0, 3))  # 由于typed=True,这将被视为一个新的缓存键

2.3 缓存的透明性

使用lru_cache装饰器后,你可以像往常一样调用函数,而不需要知道缓存的存在。缓存是透明的,它会在需要时自动工作。

🚀三、使用场景与示例

lru_cache装饰器在许多场景中都非常有用。例如,在Web开发中,你可能需要频繁地查询数据库或执行复杂的计算,而这些操作的结果可以在短时间内保持不变。通过使用lru_cache,你可以缓存这些结果,从而显著提高性能。

下面是一个简单的示例,展示了如何在Web应用中使用lru_cache来缓存数据库查询结果:

from functools import lru_cache@lru_cache(maxsize=1024)
def get_user_data(user_id):# 假设这是一个复杂的数据库查询# ...# 返回查询结果return query_database(user_id)# 在Web请求中调用get_user_data函数
user_data = get_user_data(123)

在这个示例中,get_user_data函数使用lru_cache装饰器进行了缓存。当Web请求需要获取用户数据时,它将首先尝试从缓存中获取结果。如果缓存中不存在所需的数据,它将执行数据库查询并将结果存储在缓存中。这样,对于相同的用户ID,后续的请求将直接从缓存中获取结果,而不需要再次执行数据库查询。

🚀四、总结与展望

lru_cache是Python中一个非常有用的装饰器,它可以帮助我们提高计算密集型函数的性能。通过缓存函数的结果,我们可以避免重复计算相同的操作,并减少不必要的计算开销。在本文中,我们详细解析了lru_cache的工作原理、使用场景与示例。希望这些信息能够帮助你更好地理解和使用lru_cache装饰器,并在实际项目中发挥它的最大作用。

随着Python生态系统的不断发展壮大,相信未来会有更多优秀的缓存库和工具出现,为我们提供更强大、更灵活的缓存解决方案。让我们期待未来Python在缓存技术方面的更多创新和进步!

相关文章:

  • 【Android面试八股文】Kotlin内置标准函数let的原理是什么?
  • 初识C++ · 继承(1)
  • 乐鑫ESP32相关资料整理
  • 喜马拉雅项目调整
  • 让NSdata对象转变成UIImage对象再裁剪图片的方法
  • Linux--视频推流及问题
  • 新渠道+1!TDengine Cloud 入驻 Azure Marketplace
  • 代码随想录刷题复习day01
  • Java多线程设计模式之保护性暂挂模式
  • 关于Threejs的使用二
  • 东芝-Soft Limit 报警及其解决办法
  • 代码随想录算法训练营第29天(贪心)|455.分发饼干、376. 摆动序列、53. 最大子序和
  • C语言 图的基础知识
  • HTTP/2 协议学习
  • VMware ESXi 8.0U2c macOS Unlocker OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)
  • 深入了解以太坊
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • [译]前端离线指南(上)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Codepen 每日精选(2018-3-25)
  • HashMap剖析之内部结构
  • java正则表式的使用
  • mac修复ab及siege安装
  • PAT A1120
  • Wamp集成环境 添加PHP的新版本
  • 看域名解析域名安全对SEO的影响
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​MySQL主从复制一致性检测
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • ${factoryList }后面有空格不影响
  • (12)Hive调优——count distinct去重优化
  • (7) cmake 编译C++程序(二)
  • (LLM) 很笨
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二) 初入MySQL 【数据库管理】
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (规划)24届春招和25届暑假实习路线准备规划
  • (六)激光线扫描-三维重建
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .equals()到底是什么意思?
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core 项目指定SDK版本
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /bin/rm: 参数列表过长"的解决办法
  • @EnableAsync和@Async开始异步任务支持
  • @FeignClient注解,fallback和fallbackFactory
  • [ SNOI 2013 ] Quare
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [1] 平面(Plane)图形的生成算法