当前位置: 首页 > 知识库问答 >
问题:

Python中的递归、记忆和可变缺省参数

路思源
2023-03-14

“BASE”表示不只是使用LRU_Cache。所有这些都是“足够快的”--我不是在寻找最快的算法--但是时间让我吃惊,所以我希望我能学到一些关于Python是如何“工作”的东西。

def fibonacci(n):
    a, b = 0, 1
    if n in (a, b): return n
    for _ in range(n - 1):
        a, b = b, a + b
    return b
def fibonacci(n, memo={0:0, 1:1}):
    if len(memo) <= n:
        memo[n] = fibonacci(n - 1) + fibonacci(n - 2)
    return memo[n]
def fib_seq():
    a, b = 0, 1
    yield a
    yield b
    while True:
        a, b = b, a + b
        yield b

def fibonacci(n):
    return next(x for (i, x) in enumerate(fib_seq()) if i == n)
loop: about 140 μs
memo: about 430 ns
genr: about 250 μs

现在很清楚了,我(和前面的许多人一样)只是偶然发现了Python的可变缺省参数。这种行为解释了执行速度的实际和明显的提高。

共有1个答案

那存
2023-03-14

你所看到的是记忆的全部意义。第一次调用该函数时,memo缓存为空,并且必须递归。但下一次使用相同或更低的参数调用它时,答案已经在缓存中,因此它立即返回。如果您执行了数千个呼叫,那么您将第一个呼叫的时间摊销到所有其他呼叫中。这就是什么使memoization如此有用的优化,您只需支付成本第一次。

如果您想看看当缓存是新鲜的并且您必须执行所有递归时需要多长时间,那么您可以在基准调用中将初始缓存作为显式参数传递:

fibonacci(100, {0:0, 1:1})
 类似资料:
  • 问题内容: 我有一个程序可以通过递归传递大量数据,例如1000个变量。递归将至少运行50或60次。我担心的是,由于没有足够的空间,是否有可能数据在内存位置上被覆盖,或者如果没有内存,那么我会得到一些例外,即程序内存已经用完(我没有收到这样的错误)? 是否存在错误的解决方案,因为该程序没有更多的内存并且在现有位置上被覆盖? 问题答案: 涉及两个存储区域:堆栈和堆。堆栈是保存方法调用的当前 状态 (即

  • 问题内容: 我在大学为我的Programming II类编写的程序需要一些帮助。这个问题要求人们使用递归来计算斐波那契数列。必须将计算出的斐波那契数存储在一个数组中,以停止不必要的重复计算并减少计算时间。 我设法使程序在没有数组和存储的情况下运行,现在我试图实现该功能,但遇到了麻烦。我不确定如何组织它。我已经浏览了Google并浏览了一些书,但没有太多帮助我解决如何实施解决方案的方法。 上面是不正

  • 我试图通过记忆来解决“计数变化”的问题。 考虑下面的问题:我们可以用多少种不同的方式来换取1美元,半价、四分之一、二分硬币、五分硬币和五分硬币?更一般地说,我们可以编写一个函数来计算使用任何一组货币面额改变任何给定金额的方法的数量吗? 以及递归的直观解决方案。 使用n种硬币改变a的数量的方法数 除第一种硬币外,其他所有硬币都可以换成硬币的方法,加上 使用所有n种硬币改变较小数量a-d的方法的数量,

  • 本文向大家介绍动态规划和带记忆递归的区别相关面试题,主要包含被问及动态规划和带记忆递归的区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 自顶而下和自底而上

  • 根据维基百科和我查阅过的其他来源,你需要矩阵;-物品数和-背包的总容量。这个矩阵变得很大,有时太大了,无法在C程序中处理它。我知道动态编程是基于节省内存的时间,但是,有什么解决方案可以节省时间和内存吗?

  • 来自Python的递归追加列表函数,试图递归地获取与文件结构相关的权限列表。 另一种情况是,A=允许,R=限制 输出将是[True,True,False,False,True,True,True]