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()装饰器可以有效地管理和优化缓存,而不会导致系统崩溃。

相关推荐
工业互联网专业11 分钟前
基于python的内蒙古旅游景点数据分析系统-Flask+spider+vue
vue.js·python·flask·毕业设计·源码·课程设计·内蒙古旅游景点数据分析系统
漫谈网络11 分钟前
pysnmp模块中 GET、SET、WALK操作详细分步解析
python·pysnmp
牛马的人生12 分钟前
入门Scikit-learn:让机器学习像呼吸一样自然!
python·其他·机器学习·scikit-learn
仙人掌_lz13 分钟前
四大LLM 微调开源工具包深度解析
人工智能·python·ai·开源·llm
NULL指向我14 分钟前
C语言数据结构笔记6:使用宏和指针来设置和操作嵌套在结构体中的联合体数组的特定位
c语言·数据结构·笔记
喜欢吃燃面19 分钟前
C++:模板
c++·学习
这里有鱼汤24 分钟前
为什么我现在做Python项目都用UV?你看完就懂了
后端·python
Kilicc_27 分钟前
Qt工作总结06 < QMap<> 和QVector<QPair>、以及QPair<>和QMakePair<> >
qt·学习
小乌龟登顶记32 分钟前
编程学习网站大全(C++/OpenCV/QT方向)—— 资源导航与深度评测
c++·opencv·学习
qq_4289898137 分钟前
python 实现决策树规则
python·决策树