Python学习笔记--内置模块functools中的lru_cache()函数

在编写一些应用中,我们的一些函数常常需要做一些耗时较长的操作,比如调用第三方API,进行复杂的运算等。尤其是处理数据的一些应用,需要重复计算,或者从外部获取数据,可以使用内置模块functools中的lru_cache()函数把计算的数据缓存下来,在后面重复计算使用数据时,就不再计算而是从缓存中获取前面计算过的数据,从而提升效率。

lru_cache()是一个装饰器,它可以用于将一个函数的结果缓存起来,以便在将来的调用中重复使用这些结果,从而提高性能。它使用最近最少使用(LRU)策略来管理缓存的大小。

使用场景:

  1. 重复计算:当某个函数的结果需要重复计算时,可以使用lru_cache()来缓存结果。这样,在后续的调用中,可以直接从缓存中获取结果,而不需要重新计算。
  2. 缓存数据:当某个函数需要从外部资源(如数据库、网络等)获取数据时,可以使用lru_cache()来缓存这些数据。这样,在后续的调用中,可以直接从缓存中获取数据,而不需要重新从外部资源获取。
  3. 优化性能:对于一些计算密集型或IO密集型的函数,使用lru_cache()可以显著提高性能。因为重复计算和外部资源访问通常是耗时的操作,使用缓存可以避免不必要的计算和访问。
python 复制代码
from functools import lru_cache  
  
@lru_cache(maxsize=None)  
def factorial(n):  
    if n < 0:  
        return None  
    elif n == 0:  
        return 1  
    else:  
        return n * factorial(n-1)

在上面这个示例中,定义了一个阶乘函数factorial(),并使用lru_cache()装饰器将其缓存起来。通过设置maxsize=None,设置为缓存无限大。然后,可以多次调用factorial()函数,比如:

>>>factorial(2)

>>>factorial(8)

>>>factorial(22)

因为使用lru_cache(maxsize=None)装饰器对factorial函数进行修饰,每次对该函数进行调用时,其结果都会被缓存起来。举例来说,执行factorial(10), factorial(20), factorial(30)等调用,其结果都会被分别缓存。之后,如果再次调用factorial(10), factorial(20), factorial(30),系统会直接从缓存中获取结果,而不会重新进行计算。这样可以显著提高函数的性能,特别是对于那些需要重复计算或从外部资源获取数据的函数。

另外,lru_cache()装饰器不会导致系统崩溃,即使缓存不足也不会受到影响。当缓存已满时,最近最少使用的缓存项将被自动删除,以便为新的缓存项腾出空间。在这种情况下,下次调用该函数时将重新计算其结果,并将其添加到缓存中。因此,使用lru_cache()装饰器可以有效地管理和优化缓存,而不会导致系统崩溃。

相关推荐
一百天成为python专家25 分钟前
Python循环语句 从入门到精通
开发语言·人工智能·python·opencv·支持向量机·计算机视觉
Sunhen_Qiletian29 分钟前
朝花夕拾(五)--------Python 中函数、库及接口的详解
开发语言·python
前路不黑暗@1 小时前
C语言:操作符详解(二)
c语言·开发语言·经验分享·笔记·学习·学习方法·visual studio
三年呀1 小时前
标题:移动端安全加固:发散创新,筑牢安全防线引言:随着移动互联网
网络·python·安全
蜡笔小电芯2 小时前
【STM32】STM32H750 CubeMX 配置 USB CDC 虚拟串口笔记
笔记·stm32·嵌入式硬件
xiaoxiaoxiaolll2 小时前
金刚石基植入体新突破!Adv. Funct. Mater. 报道首例增材制造固态摩擦电能量收集器
学习
x.Jessica2 小时前
网络的构成元素
网络·学习·计算机网络
关山2 小时前
MCP实战
python·ai编程·mcp
快乐zbc2 小时前
数学建模Topsis法笔记
笔记·数学建模
yiqiqukanhaiba2 小时前
STM32学习笔记14-I2C硬件控制
笔记·stm32·学习