Python functools.lru_cache自动缓存应用小结

 更新时间:2026年02月11日 10:11:35   作者:atwdy  
lru_cache会为所有同名的函数全局维护一个独立的缓存结构,不同函数之间的缓存空间不冲突,适用于所有相同输入对应相同输出的确定性函数,下面给大家介绍Python functools.lru_cache自动缓存应用,感兴趣的朋友跟随小编一起看看吧

基本介绍

lru_cache是Python3.2版本在functools标准模块中引入的装饰器,用于实现最近最少使用(Least Recently Used, LRU)缓存策略,适用于所有相同输入对应相同输出的确定性函数,即缓存函数的参数和返回值的映射,只要下次调用参数相同,就直接返回缓存的结果,不再执行函数体。

工作原理:

  • 缓存命中:当使用相同的参数调用被装饰的函数时,函数不会真正执行,而是直接从缓存中返回结果。
  • 缓存未命中:当参数不在缓存中时,函数正常执行,并将结果存入缓存。
  • 缓存淘汰:当缓存(不同参数个数)达到设定的最大容量(由 maxsize参数指定)时,它会自动淘汰最久未被使用的结果,以控制内存占用。

可通过参数maxsize=n指定缓存的最大容量,参数值为None表示无限制缓存,会缓存所有不同参数组合的函数返回值,性能最优但存在内存溢出的风险,根据实际情况设置。

在递归中的应用

lru_cache虽然适用于所有确定性的函数,但在递归场景中使用特别合适,因为递归场景中往往需要重复计算相同的子问题。以下面斐波那契数列为例:

def fib(num):
    if num == 0 or num == 1:
        return num
    return fib(num - 1) + fib(num - 2)

fib(5)对应的递归树:

               fib(5)
               /      \
          fib(4)      fib(3)
         /     \       /    \
     fib(3)  fib(2)  fib(2) fib(1)
    /    \    /   \   /   \
 fib(2) f(1) f(1)f(0) f(1)f(0)
 /   \
f(1) f(0)

如果不使用缓存,fib(3)和fib(2)都被重复计算了多次,如果把这棵递归树看成满二叉树,fib(n)一共有n层,每层的节点数量分别为 2 0 2^0 20, 2 1 2^1 21, 2 2 2^2 22, …, 2 n 2^n 2n, 那么总的时间复杂度 O ( 2 n ) O(2^n) O(2n)

如果使用了lru,函数会在第一次计算矩形标记的fib(0),fib(1),…, fib(5)时将每个参数对应的函数值缓存,也就是对于fib(5)的整个计算流程中,标记的6个记录在第一次计算时未命中缓存,会执行函数并将这6个记录的结果缓存,在后续计算中直接读取圆形标记的fib(1),fib(2),fib(3)的缓存,直接读取3次缓存就可以直接结束整个函数。


对于上面的分析可使用被装饰函数的cache_info方法输出详细的缓存信息查看:

from functools import lru_cache
@lru_cache(maxsize=None)
def fib(num):
    if num == 0 or num == 1:
        return num
    return fib(num - 1) + fib(num - 2)
print(fib(5))
print(fib.cache_info())

lru_cache装饰的函数也会自动同时绑定上cache_info方法,用于显示整个函数计算过程中的缓存命中情况,返回4个字段,含义分别是:
1)hits:缓存命中次数
2)misses:缓存未命中次数
3)maxsize:缓存最大容量
4)currsize:当前已缓存数量

缓存清空

lru_cache会为所有同名的函数全局维护一个独立的缓存结构,不同函数之间的缓存空间不冲突。除非手动cache_clear,否则缓存不会自动清除。

到此这篇关于Python functools.lru_cache自动缓存应用小结的文章就介绍到这了,更多相关Python functools.lru_cache缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python面向对象魔法方法和单例模块代码实例

    Python面向对象魔法方法和单例模块代码实例

    这篇文章主要介绍了Python面向对象魔法方法和单例模块代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python+wxPython实现批量文件扩展名替换

    Python+wxPython实现批量文件扩展名替换

    这篇文章主要介绍了如何使用 Python和wxPython创建一个简单的图形界面应用程序,使用户能够选择文件夹、输入要替换的文件类型和新的文件类型,并实现批量替换文件扩展名的功能,有需要的可以参考一下
    2023-10-10
  • Python3多目标赋值及共享引用注意事项

    Python3多目标赋值及共享引用注意事项

    这篇文章主要介绍了Python3多目标赋值及共享引用注意事项,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • python使用技巧-查找文件 

    python使用技巧-查找文件 

    这篇文章主要分享的是python使用技巧查找文件,下面我们就来介绍针对python查找文件的相关内容,需要的小伙伴可以参考一下
    2022-02-02
  • Python multiprocessing 进程间通信方式实现

    Python multiprocessing 进程间通信方式实现

    本文主要介绍了Python multiprocessing 进程间通信方式实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 基于Python制作股票交易计算器

    基于Python制作股票交易计算器

    这篇文章主要为大家详细介绍了如何利用Python和Html分别制作一个股票交易计算器,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
    2024-12-12
  • python实现黄金分割法的示例代码

    python实现黄金分割法的示例代码

    这篇文章主要介绍了python实现黄金分割法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python Pandas模块实现数据的统计分析的方法

    Python Pandas模块实现数据的统计分析的方法

    在上一篇讲了几个常用的“Pandas”函数之后,今天小编就为大家介绍一下在数据统计分析当中经常用到的“Pandas”函数方法,希望能对大家有所收获,需要的朋友可以参考下
    2021-06-06
  • Python实战之利用Geopandas算出每个省面积

    Python实战之利用Geopandas算出每个省面积

    GeoPandas是一个基于pandas,针对地理数据做了特别支持的第三方模块。本文将利用GeoPandas计算出每个省的面积,感兴趣的小伙伴快跟随小编一起学习一下吧
    2021-12-12
  • MindSpore导入CUDA算子的解决方案

    MindSpore导入CUDA算子的解决方案

    本文介绍了在MindSpore标准格式下进行CUDA算子开发的方法和流程,可以让开发者在现有的AI框架下仍然可以调用基于CUDA实现的高性能的算子,感兴趣的朋友跟随小编一起看看吧
    2024-05-05

最新评论