【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在缓存技术方面的更多创新和进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/355042.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程池的简介

定义 线程池就是使用多线程的方式&#xff0c;将任务添加到队列中任务都是runnable或者callable的实现类 优点 线程和任务分离&#xff0c;任务可以复用线程池统一管理线程&#xff0c;线程可以复用避免因为开启和销毁线程造成的资源浪费 官方线程池的参数分析 深度理解 线程池…

Vim基础操作:常用命令、安装插件、在VS Code中使用Vim及解决Vim编辑键盘错乱

Vim模式 普通模式&#xff08;Normal Mode&#xff09;&#xff1a; 这是 Vim 的默认模式&#xff0c;用于执行文本编辑命令&#xff0c;如复制、粘贴、删除等。在此模式下&#xff0c;你可以使用各种 Vim 命令来操作文本。插入模式&#xff08;Insert Mode&#xff09;&#…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上&#xff0c;在私服管理端也能看到该jar包的完整信息&#xff0c;但是springboot项目引入该jar包发现死活下载不下来&#xff0c;报错如图&#xff1a; 从该错误信息中可以看到&#xff0c;找不到服务名是xxl-job这个的&#xff0c;我们要找的…

vue3delete请求报403forbidden,前后端解决方式,cookie无效问题

在做开发时&#xff0c;前期已经在Controller类加上CrossOrigin(origins "*")&#xff0c;发送get和post请求都没问题&#xff0c;但遇到delete请求时&#xff0c;又报出跨域问题 一.前端添加proxy代理服务器&#xff08;未能解决&#xff09; 在vue.config.js中使…

DAY04 HTMLCSS

文章目录 一 表单(1) 数字控件(2) 颜色控件(3) 日期控件(4) 月份控件(5) 星期控件(6) 搜索控件(7) 范围控件 二 浮动框架三 结构化标签四 CSS1 CSS概述2 CSS的编写位置1. inline style 行内样式2. inner style 内部样式3. outer style 外部样式4. 小结 3 CSS选择器1. 通用选择器…

【StableDiffusion】Prompts 提示词语法;高阶用法;写作顺序是什么,先写什么后写什么

Prompt 写作顺序 第一步&#xff1a;画质词画风词 第一步先写“画质词”和“画风词” 画质词如下&#xff1a; 画风词如下&#xff1a; 第二步&#xff1a;画面主体描述 人物性别、年龄、发型、发色、情绪表情、衣服款式、衣服颜色、动作、饰品、身材、五官微调 第三步&…

Python基础教程(二十四):日期和时间

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

Redis分片集群搭建

主从模式可以解决高可用、高并发读的问题。但依然有两个问题没有解决&#xff1a; 海量数据存储高并发写 要解决这两个问题就需要用到分片集群了。分片的意思&#xff0c;就是把数据拆分存储到不同节点&#xff0c;这样整个集群的存储数据量就更大了。 Redis分片集群的结构如…

嵌入式系统软件开发环境_2.一般架构

1.Eclipse框架 嵌入式系统软件开发环境是可帮助用户开发嵌入式软件的一组工具的集合&#xff0c;其架构的主要特征离不开“集成”问题&#xff0c;采用什么样的架构框架是决定开发环境优劣主要因素。Eclipse框架是当前嵌入式系统软件开发环境被普遍公认的一种基础环境框架。目…

基 CanMV 的 C 开发环境搭建(Linux,Ubuntu篇)

不论是使用 CanMV 提供的基于 C 语言和 FreeRTOS 的应用开发方式开发应用程序或是编译 CanMV 固件&#xff0c;都需要搭建基于 CanMV 的 C 开发环境&#xff0c;用于编译 CanMV 源码。 1. 开发环境搭建说明 CanMV 提供了基于 C 语言和 FreeRTOS 的应用开发…

Hive笔记-3

3.2.2 查看表 1) 展示所有表 (1) 语法: 语法: SHOW TABLES [IN database_name] LIKE [identifier_with_wildcards]; In database_name 写的是查哪个数据库,一般不写默认是当前数据库 Like 后面跟通配符表达式 (2) 案例: 查看在 db_hive1 数据库里有没有以 stu 开头的表 …

Zookeeper 一、Zookeeper简介

1.分布式系统定义及面临的问题 分布式系统是同时跨越多给物理主机&#xff0c;独立运行的多个软件所组成的系统。类比一下&#xff0c;分布式系统就是一群人一起干活。人多力量大&#xff0c;每个服务器的算力是有限的&#xff0c;但是通过分布式系统&#xff0c;由n个服务器组…

【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏

文章目录 &#x1f680;一、了解日志&#x1f308;二、日志作用&#x1f308;三、了解日志模块⭐四、日志级别&#x1f4a5;五、记录日志-基础❤️六、记录日志-处理器handler&#x1f3ac;七、记录日志-格式化记录☔八、记录日志-配置logger&#x1f44a;九、流程梳理 &#x…

RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了,该如何解决?

安防视频监控汇聚EasyNVR智能安防视频监控平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。平台可提供的视频能力包括&#xff1a;…

SpringSecurity实战入门——认证

项目代码 gson/spring-security-demo 简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity来做安全框架。小项目有Shiro的比较多,因为相比…

HTML静态网页成品作业(HTML+CSS+JS)—— 美食企业曹氏鸭脖介绍网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现 图片轮播切换&#xff0c;共有4个页面。 二、…

宕机了, redis如何保证数据不丢?

前言 如果有人问你&#xff1a;"你会把 Redis 用在什么业务场景下&#xff1f;" 我想你大概率会说&#xff1a;"我会把它当作缓存使用&#xff0c;因为它把后端数据库中的数据存储在内存中&#xff0c;然后直接从内存中读取数据&#xff0c;响应速度会非常快。…

分支结构相关

1.if 语句 结构&#xff1a; if 条件语句&#xff1a; 代码块 小练习&#xff1a; 使用random.randint()函数随机生成一个1~100之间的整数&#xff0c;判断是否是偶数 import random n random.randint(1,100) print(n) if n % 2 0:print(str(n) "是偶数") 2.else语…

【网络安全产品】---网闸

了解了不少安全产品&#xff0c;但是对网闸的理解一直比较模糊&#xff0c;今天 what 网闸是安全隔离与信息交换系统的简称&#xff0c;使得在不影响数据正常通信的前提下&#xff0c;让络在不连通的情况下数据的安全交换和资源共享&#xff0c;对不同安全域/网络之间实现真正…

【总线】AXI总线:FPGA设计中的通信骨干

目录 AXI4&#xff1a;高性能地址映射通信的基石 AXI4-Lite&#xff1a;轻量级但功能强大的通信接口 AXI4-Stream&#xff1a;高速流数据传输的利器 结语&#xff1a;AXI总线在FPGA设计中的重要性 大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计…