当前位置: 首页 > 科技观察

加速功能,每个Python程序员都应该知道标准库的Lru_cache

时间:2023-03-13 21:02:42 科技观察

加速新境界:通过使用一个简单的缓存功能,只需一行代码就可以加速你的功能。前一段时间,我构建了一个每天运行的ETL管道,通过从外部服务中提取数据来丰富输入数据,然后将结果加载到数据库中。随着输入数据的增加,等待外部服务器的响应变得非常耗时,这使得ETL过程越来越慢。经过一番调查,我发现与记录总数(~500k)相比,不同的输入值(~500)并不多。所以换句话说,当使用相同的参数调用外部服务时,每个参数大约重复1000次。像这样的情况是使用缓存的主要用例。缓存函数意味着每当第一次计算函数的返回值时,它的输入和结果都放在字典中。对于每个后续函数调用,首先通过查看缓存来检查是否已经计算出结果。如果在缓存中找到就完美了,不用再计算了!如果不是,则计算结果并将输入和结果存储在缓存中,以便下一个函数调用可以查找它。Python标准库带有许多鲜为人知但功能强大的包。对于此示例,将使用functools中的lru_cache。(LRU代表“LeastRecentlyUsed”,顾名思义,明确表示缓存将保留最近的输入/结果对。)从Fun(c)tools导入lru_cache将c放在括号中有点像A蹩脚的笑话,因为那时functools变成了有趣的工具(funtools),当然使用缓存很有趣!这里无需过多解释。导入lru_cache并使用它来装饰一个将生成斐波那契数列的函数。装饰函数意味着用缓存函数包装该函数,随后每当调用fib_cache函数时,都会调用缓存的函数。我们运行了一个实验来计算函数的缓存和未缓存版本计算从0到40的所有斐波那契数并将结果放入它们各自的列表所花费的时间。优胜者对于较小的Fibonacci数,两者之间没有太大区别,但是一旦达到大约30个样本,缓存功能的效率收益就会开始增加。我没有耐心运行超过40个样本的未缓存版本,因为它的运行时间是指数级的。对于缓存版本,它的运行时间只是一个线性增量。就是这样!Python缓存仅一行。毕竟没那么可怕。在最初的示例中,我对Pandas数据框使用了数据转换。值得一提的是,缓存的函数可以传递给Pandasapply而无需任何其他更改。是不是很棒?也来试试吧~