Python 的lru_cache装饰器使用简介

 更新时间:2021年03月15日 10:37:14   作者:deniro  
这篇文章主要介绍了Python 的lru_cache 装饰器使用简介,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下

Python 的 lru_cache 装饰器是一个为自定义函数提供缓存功能的装饰器。其内部会在下次以相同参数调用该自定义函数时直接返回计算好的结果。通过缓存计算结果可以很好地提升性能。

1 从示例说起

假设我们有一个计算斐波那契数列的求和函数,其内部采用递归方式实现。

from xxx.clock_decorator import clock

@clock
def fibonacci(n):
 if n<2:
  return n
 return fibonacci(n-2)+fibonacci(n-1)

if __name__=='__main__':
 logging.info('fibonacci(6) -> %s',fibonacci(6))

运行结果:

其中的 clock_decorator 实现是一个可以输出某个函数运行时长的装饰器1。

从输出结果中可以看出,存在着严重的重复计算情况,比如 fibonacci(1) 就被计算了 5 次之多。这还只是计算 6 次的 fibonacci 函数。

2 优化

上面的示例代码加入 lru_cache 装饰器:

运行结果:

这次不存在重复计算现象,因此性能得到极大的提升。

3 比较

利用 cProfile 进行性能比较分析。它是一种确定性分析器,只测量 CPU 时间,并不包含内存消耗和其他与内存相关联的信息2。

假设我们需要计算 fibonacci(33) 求和值。

(1)不使用 lru_cache 装饰器

这个递归函数内部总共调用了 1000 多万次的 fibonacci() 函数!

(2)使用了 lru_cache 装饰器

使用了 lru_cache 装饰器之后,这个递归函数只需调用 100 多次fibonacci() 函数!性能有了质的提升。

4 lru_cache 装饰器

lru_cache 装饰器支持两个入参,它的完整定义格式为3: @functools.lru_cache(maxsize=128, typed=False)

参数  默认值  说明
maxsize  128  表示缓存大小。如果设置为 None,则不限大小;如果超过缓存大小,则使用 LRU 策略清理缓存。缓存的大小限制可确保缓存不会无限制增长。LRU(Least Recently Used),即删除最近最少使用的缓存数据。
typed  False  如果为true,不同类型的参数将会被分别缓存,比如区分浮点数与整型。
注意:由于使用了字典来存储缓存,所以所装饰的函数参数必须是可哈希的。
利用 cache_info() 函数,我们还可以看到命中次数 hits,未命中次数 misses ,最大缓存数量 maxsize 和 当前缓存大小 currsize。使用方式是直接调用被装饰函数的 cache_info(),形如:fibonacci.cache_info())。

只要某个函数递归调用并存在重复计算的情况,这时就要记着使用 lru_cache 这个性能加速器。

以上就是Python 的lru_cache 装饰器使用简介的详细内容,更多关于Python 的lru_cache 装饰器的资料请关注脚本之家其它相关文章!

相关文章

  • python使用clear方法清除字典内全部数据实例

    python使用clear方法清除字典内全部数据实例

    这篇文章主要介绍了python使用clear方法清除字典内全部数据,实例分析了Python中clear方法清空字典内数据的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • python Boltons库实用功能探索(深度复制类型检查重试机制)

    python Boltons库实用功能探索(深度复制类型检查重试机制)

    这篇文章主要为大家介绍了python Boltons库实用功能探索包含深度复制类型检查重试机制及数据结构转换实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 利用pyinstaller打包exe文件的基本教程

    利用pyinstaller打包exe文件的基本教程

    这篇文章主要给大家介绍了关于利用pyinstaller打包exe文件的基本方法,文中通过示例代码介绍的非常详细,对大家学习或者使用pyinstaller具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • python如何写try语句

    python如何写try语句

    在本篇文章里小编给大家整理的是一篇关于python写try语句的方法相关内容,有兴趣的朋友们可以跟着学习参考下。
    2020-07-07
  • Python保存dict字典类型数据到Mysql并自动创建表与列

    Python保存dict字典类型数据到Mysql并自动创建表与列

    这篇文章主要介绍了Python保存dict字典类型数据到Mysql并自动创建表与列,字典是另一种可变容器模型,且可存储任意类型对象,想了解更多内容的小伙伴可以和小编一起进入下面文章学习更多内容,希望对你有所帮助
    2022-02-02
  • python基础之迭代器与生成器

    python基础之迭代器与生成器

    这篇文章主要为大家介绍了python迭代器与生成器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • python pyecharts 实现一个文件绘制多张图

    python pyecharts 实现一个文件绘制多张图

    这篇文章主要介绍了python pyecharts 实现一个文件绘制多张图,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python操作Mongodb数据库的方法小结

    Python操作Mongodb数据库的方法小结

    这篇文章主要介绍了Python操作Mongodb数据库的方法,结合实例形式总结分析了Python针对MongoDB数据库的基本模块导入、连接、增删改查及排序等相关操作技巧,需要的朋友可以参考下
    2019-09-09
  • 解决pycharm最左侧Tool Buttons显示不全的问题

    解决pycharm最左侧Tool Buttons显示不全的问题

    今天小编就为大家分享一篇解决pycharm最左侧Tool Buttons显示不全的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 解决python中用matplotlib画多幅图时出现图形部分重叠的问题

    解决python中用matplotlib画多幅图时出现图形部分重叠的问题

    今天小编就为大家分享一篇解决python中用matplotlib画多幅图时出现图形部分重叠的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论