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抓取搜狗微信公众号文章

    python抓取搜狗微信公众号文章

    这篇文章主要为大家详细介绍了python抓取搜狗微信公众号文章,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • python数据XPath使用案例详解

    python数据XPath使用案例详解

    xpath是最常用且最便捷高效的一种解析方式,通用型强,其不仅可以用于python语言中,还可以用于其他语言中,数据解析建议首先xpath
    2021-09-09
  • Python序列化模块JSON与Pickle

    Python序列化模块JSON与Pickle

    这篇文章介绍了Python的序列化模块JSON与Pickle,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • Python自动化之数据驱动让你的脚本简洁10倍【推荐】

    Python自动化之数据驱动让你的脚本简洁10倍【推荐】

    数据驱动是一种思想,让数据和代码进行分离。这篇文章主要介绍了Python自动化之数据驱动,让你的脚本简洁10倍,需要的朋友可以参考下
    2019-06-06
  • 从零开始学习Python与BeautifulSoup网页数据抓取

    从零开始学习Python与BeautifulSoup网页数据抓取

    想要从零开始学习Python和BeautifulSoup网页数据抓取?本指南将为你提供简单易懂的指导,让你掌握这两个强大的工具,不管你是初学者还是有经验的开发者,本指南都能帮助你快速入门并提升技能,不要错过这个机会,开始你的编程之旅吧!
    2024-01-01
  • python列表的增删改查实例代码

    python列表的增删改查实例代码

    下面小编就为大家分享一篇python列表的增删改查实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • python实现汉诺塔算法

    python实现汉诺塔算法

    这篇文章主要为大家详细介绍了python实现汉诺塔算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Python使用迭代器捕获Generator返回值的方法

    Python使用迭代器捕获Generator返回值的方法

    这篇文章主要介绍了Python使用迭代器捕获Generator返回值的方法,结合具体实例形式分析了Python迭代器获取生成器返回值的相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • Python numpy.zero() 初始化矩阵实例

    Python numpy.zero() 初始化矩阵实例

    今天小编就为大家分享一篇Python numpy.zero() 初始化矩阵实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python3如何使用多线程升程序运行速度

    Python3如何使用多线程升程序运行速度

    这篇文章主要介绍了Python3如何使用多线程升程序运行速度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论