如果我们正在创建递归函数(比如返回斐波那契数列),并使用`lru_cache`,那么控制`maxsize`参数的真正因素是什么?
很明显,当计算每个项时,我们只需要最后两个项。但将`maxsize`设置为2,并运行前1000个计算将需要很长时间才能完成。
我尝试使用一个仅包含两个元素的缓存字典:
很明显,当计算每个项时,我们只需要最后两个项。但将`maxsize`设置为2,并运行前1000个计算将需要很长时间才能完成。
我尝试使用一个仅包含两个元素的缓存字典:
fib_cache = {0: 1, 1: 1}
def fib(n):
if n == 1:
val = 1
elif n == 2:
val = 1
elif n > 2:
val = fib_cache[0] + fib_cache[1]
fib_cache[0] = fib_cache[1]
fib_cache[1] = val
return val
然后,我使用lru_cache
运行了类似的函数:
from functools import lru_cache
@lru_cache(maxsize=3)
def fib1(n):
if n == 1:
val = 1
elif n == 2:
val = 1
elif n > 2:
val = fib1(n - 1) + fib1(n - 2)
return val
我对每个函数的前1000次计算进行了比较,结果在性能方面完全相同。然而,我不确定如何指定maxsize
参数。我只发现,在这个特定的函数中,2会花费很长时间,而3就可以正常工作。我的猜测是,它将结果(即fib1(n)
)与最后两个用于计算它的项(即fib1(n-1)和fib1(n-2)
)一起存储,但为什么结果不会立即替换最旧的项呢?fib1(n)
是否在计算之前就已经放在缓存内存中?
有没有办法查看lru_cache
元素?也许这会有所帮助。