首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定lru_cache所需的最大尺寸?

如何确定lru_cache所需的最大尺寸?
EN

Stack Overflow用户
提问于 2020-05-22 09:43:38
回答 1查看 1.4K关注 0票数 3

如果我们创建一个递归函数,比如返回斐波纳契序列的递归函数,并使用lru_cache ..max size参数的真正调控器是什么?

很明显,在计算每一项时,我们只需要最后两项。但是将maxsize设置为2并运行第一个1000计算将需要很长时间才能完成。

我尝试使用只包含两个元素的缓存字典:

代码语言:javascript
复制
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运行一个类似的函数。

代码语言:javascript
复制
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元素吗?也许这会有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-22 10:51:05

您是对的,仅缓存2个值就足以满足Fibonacci计算的需要。

您的函数不能正常工作,因为递归调用没有按照良好的顺序设置。将一些打印语句添加到您的函数中,您将了解它的行为。

代码语言:javascript
复制
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)以使其工作:

代码语言:javascript
复制
@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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61952140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档