加速函数,每个Python程序员都应该了解标准库的Lru_cache

栏目: IT技术 · 发布时间: 4年前

内容简介:加速新境界:通过使用简单的缓存功能,仅需一行代码即可加速你的函数。不久前,我构建了一个日常运行的ETL管道,其通过从外部服务中抽取数据来丰富输入数据,然后将结果加载到数据库中。随着输入数据的增加,等待外部服务器的响应变得非常费时,这使得ETL进程越来越慢。经过一番调查,我发现与总记录数(~500k)相比,并没有太多不同的输入值(~500)。

加速新境界:通过使用简单的缓存功能,仅需一行代码即可加速你的函数。

不久前,我构建了一个日常运行的ETL管道,其通过从外部服务中抽取数据来丰富输入数据,然后将结果加载到数据库中。

随着输入数据的增加,等待外部服务器的响应变得非常费时,这使得ETL进程越来越慢。经过一番调查,我发现与总记录数(~500k)相比,并没有太多不同的输入值(~500)。

因此,换句话说,使用相同的参数调用外部服务时,每个参数大约要重复执行1000次。

像这样的情况是使用缓存的主要用例。缓存一个函数意味着无论何时首次计算函数的返回值,都会将其输入和结果放在字典中。

对于每个后续函数调用,首先通过查看缓存来检查结果是否已经计算过。如果在缓存中找到了,那就很完美,不需要再次计算!如果没有找到,就计算结果并将输入和结果存储在缓存中,以便下一个函数调用时查找到它。

Python标准库附带了许多鲜为人知但功能强大的软件包。对于本示例,将使用functools中的lru_cache。(LRU代表“最近最少使用(Least Recently Used)”,正如字面意思,这明确意味着缓存将保留最近的输入/结果对。)

从Fun(c)tools中导入lru_cache

把c放进括号中有点像一个蹩脚的笑话,因为这样functools就变成了fun tools(有趣的工具),使用缓存当然很有趣!

加速函数,每个 <a href='https://www.codercto.com/topics/20097.html'>Python</a> 程序员都应该了解标准库的Lru_cache

这里无需过多解释。导入lru_cache并用它来装饰一个函数,该函数将生成斐波那契数。

装饰函数意味着将该函数与缓存函数包装在一起,随后每当调用fib_cache函数时,都将调用缓存的函数。

比赛开始

加速函数,每个Python程序员都应该了解标准库的Lru_cache

我们进行了一个实验,计算函数的缓存和未缓存版本从0到40计算所有斐波那契数所花费的时间,并将结果放入各自的列表中。

获胜者

加速函数,每个Python程序员都应该了解标准库的Lru_cache

对于较小的斐波那契数,二者并没有什么大的区别,但是一旦达到约30个样本,缓存函数的效率增益就开始累加。

我没有耐心让未缓存的版本运行超过40个样本,因为它的运行时间是指数增长的。而对于缓存的版本,它的运行时间只是线性增量。

加速函数,每个Python程序员都应该了解标准库的Lru_cache

这就完成了!距离Python缓存仅一行代码之遥。毕竟它并没那么可怕。

在初始示例中,我在Pandas数据框上使用了数据转换。值得一提的是,缓存的函数可以传递给Pandas apply,而无需进行其它的任何更改。

是不是很棒?你也来试试吧~


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

游戏编程权威指南

游戏编程权威指南

Mike McShaffry 麦克沙福瑞、David “Rez” Graham 格雷海姆 / 师蓉、李静、李青翠 / 人民邮电 / 2016-3 / 99.00元

全书分为4个部分共24章。首部分是游戏编程基础,主要介绍了游戏编程的定义、游戏架构等基础知识。 第二部分是让游戏跑起来,主要介绍了初始化和关闭代码、主循环、游戏主题和用户界面等。 第三部分是核心游戏技术,主要介绍了一些*为复杂的代码 示例,如3D编程、游戏音频、物理和AI编程等。 第四部分是综合应用,主要介绍了网络编程、多道程序设计和用C#创建工具等,并利用前面所讲的 知识开发出......一起来看看 《游戏编程权威指南》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具