导航:首页 > 编程语言 > python模拟带时间缓存

python模拟带时间缓存

发布时间:2025-05-20 17:43:36

python性能提升神器!lru_cache的介绍和讲解

我们经常谈论的缓存一词,更多的类似于将硬盘中的数据存放到内存中以至于提高读取速度,比如常说的redis,就经常用来做数据的缓存。 Python的缓存(lru_cache)是一种装饰在被执行的函数上,将其执行的结果缓存起来,当下次请求的时候,如果请求该函数的传参未变则直接返回缓存起来的结果而不再执行函数的一种缓存装饰器。

那它和redis的区别在哪?有什么优势?怎么使用? 下面为你讲解

1.现在我们先不使用缓存来写一个求两数之和的函数,并调用执行它两次:

执行结果

可以看到 test 被执行了两次,现在我们加上缓存再进行执行:

执行结果

可以看到 test 函数只被执行了一次,第二次的调用直接输出了结果,使用了缓存起来的值。

2.当我们使用递归求斐波拉契数列 (斐波那契数列指的是这样一个数列:0,1,1,2,3,5,8,它从第3项开始,每一项都等于前两项之和) 的时候,缓存对性能的提升就尤其明显了:

不使用缓存求第40项的斐波拉契数列

执行时间

使用缓存求第40项的斐波拉契数列:

执行时间

两个差距是非常明显的,因为不使用缓存时,相当于要重复执行了很多的函数,而使用了 lru_cache 则把之前执行的函数结果已经缓存了起来,就不需要再次执行了。

查看lru_cache源码会发现它可以传递两个参数: maxsize 、 typed :

代表被lru_cache装饰的方法最大可缓存的结果数量 (被装饰方法传参不同一样,则结果不一样;如果传参一样则为同一个结果) , 如果不指定传参则默认值为128,表示最多缓存128个返回结果,当达到了128个时,有新的结果要保存时,则会删除最旧的那个结果。如果maxsize传入为None则表示可以缓存无限个结果;

默认为false,代表不区分数据类型,如果设置为True,则会区分传参类型进行缓存,官方是这样描述的:

但在python3.9.8版本下进行测试,typed为false时,按照官方的测试方法测试得到的还是会被当成不同的结果处理,这个时候typed为false还是为true都会区别缓存,这与官方文档的描述存在差异:

执行结果

但如果是多参数的情况下,则会被当成一个结果:

执行结果

这个时候设置typed为true时,则会区别缓存:

执行结果

当传参个数大于1时,才符合官方的说法,不清楚是不是官方举例有误

当传递的参数是dict、list等的可变参数时,lru_cache是不支持的,会报错:

报错结果

缓存 缓存位置 是否支持可变参数 是否支持分布式 是否支持过期时间设置 支持的数据结构 需单独安装 redis 缓存在redis管理的内存中 是 是 是 支持5种数据结构 是 lru_cache 缓存在应用进程的内存中,应用被关闭则被清空 否 否 否 字典(参数为:key,结果为:value) 否

经过上面的分析,lru_cache 功能相对于redis来说要简单许多,但使用起来更加方便,适用于小型的单体应用。如果涉及的缓存的数据种类比较多并且想更好的管理缓存、或者需要缓存数据有过期时间(类似登录验证的token)等,使用redis是优于lru_cache的。

Ⅱ Python 爬虫进阶篇——diskcache缓存

在Python爬虫进阶篇中,我们深入探讨了缓存技术,特别是diskcache,一个基于磁盘的缓存库。本文旨在帮助提高爬虫的效率,通过减少不必要的网络请求。diskcache的核心在于使用磁盘空间作为缓存,有效利用系统中可能被浪费的空余磁盘空间,为爬虫应用提供高效的数据存储和检索能力。



安装与初始化


diskcache的安装非常简单,只需要通过Python的包管理工具即可完成。初始化diskcache时,只需提供目录路径,系统将自动创建所需的目录结构,以确保缓存数据的安全存储。



缓存操作


在diskcache中,创建和获取缓存数据的操作简单明了。初始化后,通过`diskcache.Cache`类轻松进行缓存的设置与获取。设置缓存时,需要指定键值、值、过期时间、读取模式、标签和重试策略等参数。获取缓存时,只需指定键值,diskcache将返回相应的缓存数据,若数据不存在,可设置默认返回值。



更新与添加缓存


diskcache提供`touch`方法用于更新缓存的时间戳,以及`add`方法用于在确保缓存不存在时添加新的数据。`add`方法的独特之处在于它首先检查缓存是否已过期,只有在缓存未过期或不存在的情况下才会添加新的数据,确保了数据的一致性和有效性。



增量与减量操作


对于需要数值操作的缓存场景,diskcache提供了`incr`和`decr`方法,用于实现数据的原子性增量和减量。这些方法确保在操作过程中数据的一致性和完整性,适用于需要实时更新计数器等场景。



删除缓存


当不再需要某些缓存数据时,diskcache提供了`delete`和`pop`方法进行数据的删除。`delete`方法用于删除指定的键值,并返回操作是否成功的标志;`pop`方法则用于删除指定键值的缓存并返回其值,若键值不存在则返回默认值。



过期缓存的处理


diskcache中的过期缓存不会被实际删除,而是被系统过滤,以节省资源。如果需要清除大量过期缓存,可以使用`expire`方法,该方法允许指定删除时间范围,清理不再使用的数据,释放磁盘空间。



总结与应用


总结来说,diskcache是一个功能强大、易于使用的磁盘缓存库,特别适合Python爬虫应用。它能够显着提高爬虫的效率,减少重复请求,节省资源。对于爬取大型网站或进行脚本测试时,diskcache是不可或缺的工具,有助于构建更高效、更可持续的爬虫系统。

Ⅲ python中的垃圾回收机制和缓存机制

在深入理解Python的垃圾回收机制之前,首先需明确两个核心概念——内存泄漏与内存溢出。

内存泄漏指的是程序在使用完毕后,未能释放的内存空间,导致这些空间长期被占用,造成系统资源浪费和性能下降。而内存溢出则发生在程序请求分配内存时,因系统资源不足而无法得到满足。

Python通过引用计数机制进行内存管理。在C语言源码中,每个对象都拥有一个引用计数器,用于统计被引用的次数。程序运行时,引用计数实时更新。当引用计数降为0时,对象将被自动回收,释放内存空间。使用sys.getrefcount()函数可以获取对象的引用计数值。

然而,引用计数机制在处理循环引用时存在问题。当两个对象相互引用,计数器无法降至0,导致内存泄漏。为解决此问题,Python采用标记-清除算法。该算法通过维护两个双端链表,分别存放需要扫描和已标记为不可达的对象。遍历容器对象,解除循环引用影响后,将未标记可达的对象移至回收列表。再次遍历时,移除未被引用的对象。

为了提高垃圾回收效率,Python引入分代回收机制。基于对象存在时间越长,成为垃圾的可能性越小的假设,减少回收过程中遍历的对象数,从而加快回收速度。

Python还通过缓存机制优化内存管理。当对象的引用计数为0时,不直接回收内存,而是将其放入缓存列表中进行缓存。对于特定数据类型,如整数、浮点数、列表、字典、元组,Python分别采用free_list、缓存池和驻留机制进行优化,以减少内存分配和释放的开销,提高程序性能。

具体来说,free_list机制用于缓存特定数据类型(如整数、浮点数)的内存地址,以便重复使用;缓存池预先创建并存储常用数据类型,如小整数、布尔类型、字符串;驻留机制通过字典存储相同值的变量,避免重复内存分配,实现内存节省。

通过上述机制,Python的垃圾回收和缓存机制有效管理内存资源,提升程序运行效率,同时避免内存泄漏和内存溢出问题。

阅读全文

与python模拟带时间缓存相关的资料

热点内容
51单片机的tr 浏览:263
为啥个人办不了解压手续 浏览:259
小孩子点读app怎么看课本 浏览:652
博客的源码怎么用 浏览:874
唐诗精选pdf 浏览:146
浏览器怎么保存整个源码 浏览:587
软件与服务器连接错误怎么办 浏览:573
加密狗的东西在哪里找 浏览:7
压缩玩具瓶子 浏览:706
怎么给老福特app评分 浏览:664
程序员成富二代 浏览:296
新闻学和程序员的薪资待遇 浏览:404
ecs服务器怎么样 浏览:408
阿里云服务器的安全组全部勾选 浏览:604
php教学网站 浏览:312
php正则表达式语法 浏览:622
at单片机下载方式 浏览:347
安卓新系统桌面布局怎么好看 浏览:546
ab源码下载 浏览:558
axureandroid控件下载 浏览:219