- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 的lru_cache装饰器使用简介由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Python 的 lru_cache 装饰器是一个为自定义函数提供缓存功能的装饰器。其内部会在下次以相同参数调用该自定义函数时直接返回计算好的结果。通过缓存计算结果可以很好地提升性能.
假设我们有一个计算斐波那契数列的求和函数,其内部采用递归方式实现.
运行结果:
其中的 clock_decorator 实现是一个可以输出某个函数运行时长的装饰器1.
从输出结果中可以看出,存在着严重的重复计算情况,比如 fibonacci(1) 就被计算了 5 次之多。这还只是计算 6 次的 fibonacci 函数.
上面的示例代码加入 lru_cache 装饰器:
运行结果:
这次不存在重复计算现象,因此性能得到极大的提升.
利用 cProfile 进行性能比较分析。它是一种确定性分析器,只测量 CPU 时间,并不包含内存消耗和其他与内存相关联的信息2.
假设我们需要计算 fibonacci(33) 求和值.
(1)不使用 lru_cache 装饰器 。
这个递归函数内部总共调用了 1000 多万次的 fibonacci() 函数! 。
(2)使用了 lru_cache 装饰器 。
使用了 lru_cache 装饰器之后,这个递归函数只需调用 100 多次fibonacci() 函数!性能有了质的提升.
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 装饰器的资料请关注我其它相关文章! 。
原文链接:https://juejin.cn/post/6939345971042058248 。
最后此篇关于Python 的lru_cache装饰器使用简介的文章就讲到这里了,如果你想了解更多关于Python 的lru_cache装饰器使用简介的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何配置lru_cache根据接收到的实际值而不是如何调用函数来键入其缓存? >>> from functools import lru_cache >>> @lru_cache ... def f(
在运行下面的代码时,我收到 Python 无法导入 lru_cache 的错误。但是,每次导入(数学等)都会发生这种情况。我已经尝试了我可以在互联网上找到的每一个教程来尝试让这个东西工作。我已经重新安
我知道 cache_clear。但是我想知道如何清除单个调用的缓存。看到 cache_clear 不接受参数,我认为唯一的方法是直接弄乱底层字典。会有什么副作用(如果有的话)? 我们的目标是实现以下目
在 Python3 的 functools 包中,有一个 lru_cache() 装饰器可以内存您的函数调用。 有没有办法让我将这个缓存转储到一个文件中,然后再将文件加载回内存中? 我在 functo
我有一个带有方法/属性 multiplier 的对象。这个方法在我的程序中被多次调用,所以我决定在它上面使用lru_cache()来提高执行速度。正如预期的那样,它要快得多: 下面的代码显示了问题:
我试图了解 python (3) 中 lru_cache decorator 的实现,特别是它如何从函数 创建 key args 为其内部 dict。 我一直在读这篇文章https://github.
我正在尝试为一些计算科学代码组合数据类、属性和 lru_caches: from dataclasses import dataclass from typing import Any from fu
我在使用 django 应用程序的日志中收到此错误。我认为使用 Python 2.x 时会发生此类错误,但在我的虚拟环境中会发生 Python - 3.6.5 . Django - 2.0.7 .带有
根据documentation lru_cache 的默认值来自 functools是 128。但是没有定义单位。 Decorator to wrap a function with a memoiz
我在 Windows 上使用 Python 3.7 运行每个代码时都会发生此错误: Traceback (most recent call last): File "test.py", line
我有一个像这样的 Python 单调度通用函数: @singledispatch def cluster(documents, n_clusters=8, min_docs=None, depth=2
是否可以在项目被逐出时为 functools.lru_cache 定义回调?在回调中,缓存的值也应该存在。 如果没有,也许有人知道支持逐出和回调的轻量级类字典缓存? 最佳答案 我将发布我使用的解决方案
我想要一个可以使用 functools.lru_cache 的函数,但默认情况下不能。我正在寻找一种方法来使用可用于禁用 lru_cache 的函数参数。目前,我有两个版本的函数,一个有 lru_ca
这个问题在这里已经有了答案: How do I use cache_clear() on python @functools.lru_cache (3 个答案) 关闭 6 年前。 有什么方法可以覆盖
在评论中:Is there a decorator to simply cache function return values? @gerrit 指出了将可变但可散列的对象用于带有 functool
是否可以使用 functools.lru_cache 来缓存由 functools.partial 创建的部分函数? 我的问题是一个函数,该函数采用可散列参数和常量、不可散列对象(例如 NumPy 数
我有一个将(以及其他)字典作为参数的方法。该方法是解析字符串,字典提供了一些子字符串的替换,所以它不必是可变的。 这个函数经常被调用,而且在冗余元素上,所以我认为缓存它会提高它的效率。 但是,正如您可
这是我要通过缓存增强的功能的框架,因为执行RPC(远程过程调用)涉及到其他主机的TCP连接。 def rpc(rpc_server, rpc_func, arg): return rpc_se
这是我的情况,is_exist功能有性能问题。 def is_exist(link :str) -> bool: if query_db(link) is True: ret
作为并行化一些现有代码(使用多处理)的一部分,我遇到了类似于下面类的东西需要被 pickle 的情况。 从...开始: import pickle from functools import lru_
我是一名优秀的程序员,十分优秀!