告诉我为什么не работает @lru_cache(来自functools)对于这么简单的功能,我想研究缓存,我举了一个简单的例子,它对我不起作用(python ~ 3.9)
from functools import lru_cache
import time
@lru_cache(maxsize=10)
def test(num):
result = 0
for i in range(num):
result += i
return result
start = time.time()
test(num=100000000)
end = time.time()
print(f"result 1: {end - start}")
print(test.cache_info())
我使用 lru_cache 装饰器或不使用它来执行该函数,它根本没有区别:/
看,装饰器
@lru_cache是用来记忆递归函数的。在您的情况下,根本没有必要记住,因为 该函数被调用一次,循环在其中运行。为了记忆一些东西,你必须首先得到至少一个起点。你没有它,所以一个大数字的干净计算发生并结束。这是一个简单的示例,您可以比较使用和不使用它的运行速度:
更新
这是一个示例,可以更容易地注意到程序工作的差异
好吧,关于什么
lru_cache不适合你的任务,你已经写过了。每个功能都需要正确的方法来加速它。内部有一个循环(甚至更好的是两个嵌套循环)的函数通常可以使用 decorator 很好地加速numba.njit(),如果幸运的话,加速度将达到 2 个数量级。您可以像这样在代码中检查这一点 - 我们不会更改其中的任何内容,我们只是使用不同的装饰器:但是还有其他的选择,比如可以使用库
numpy,加速也会很大,但是这里你得稍微重写一下代码,比如像这样:了解在哪种情况下使用哪些数据结构和库非常重要。没有一种通用的补救措施。但是有很多不同的,你需要了解它们并能够应用它们。
PS 顺便说一句,如果您从函数中删除循环并立即对其求和
range,那么它已经可以在没有任何装饰器和其他库的情况下快几倍: