gpt4 book ai didi

python - 如何确定lru_cache所需的maxsize?

转载 作者:行者123 更新时间:2023-12-04 09:54:26 25 4
gpt4 key购买 nike

如果我们正在创建一个递归函数,如返回斐波那契数列的递归函数,并使用 lru_cache ..什么才是真正的州长max size范围?

很明显,我们在计算每一项时只需要最后两项......但设置maxsize2并运行第一个 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) and fib1(n - 2) ,但为什么结果不会立即替换最旧的项目?是否 fib1(n)甚至在计算之前就在高速缓存中发生?
有没有办法查看 lru_cache元素?也许这会有所帮助。

最佳答案

你说得对,仅缓存 2 个值就足以进行斐波纳契计算 .

您的功能无法正常工作,因为 递归调用未按良好顺序设置 .向您的函数添加一些打印语句,您将了解它的行为。

from functools import lru_cache

@lru_cache(maxsize=2)
def fib(n):
print(f'calling fib({n})')
if n == 1:
val = 1
elif n == 2:
val = 1
elif n > 2:
val = fib(n - 1) + fib(n - 2)
print(f'fib({n}) is being computed')
return val

fib(5)

# calling fib(5)
# calling fib(4)
# calling fib(3)
# calling fib(2)
# fib(2) is being computed
# calling fib(1)
# fib(1) is being computed
# fib(3) is being computed
# calling fib(2)
# fib(2) is being computed
# fib(4) is being computed
# calling fib(3)
# calling fib(1)
# fib(1) is being computed
# fib(3) is being computed
# fib(5) is being computed

这里发生的事情是当你从 fib(4) 计算时,需要 fib(3)fib(2) .但是 fib(3)需要 fib(2) 然后 fib(1) ,所以最后两个电话是 fib(3)fib(1 ) 所以你需要再次重新计算 fib(2) .

所以你应该切换 fib(n - 1)fib(n - 2)使其工作:
@lru_cache(maxsize=2)
def fib(n):
if n == 1:
val = 1
elif n == 2:
val = 1
elif n > 2:
val = fib(n - 2) + fib(n - 1)
return val

关于python - 如何确定lru_cache所需的maxsize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61952140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com