Python递归屈服渐近运行时

时间:2014-08-26 19:20:10

标签: python recursion generator time-complexity

我正在编写一个递归生成器函数,基本上看起来像这样:

def f(n):
  if n > 0:
    for i in f(n-1):
      yield i
  yield n

这有运行时O(n ^ 2)。可悲的是,python3(3.3)版本

def f(n):
  if n > 0:
    yield from f(n-1)
  yield n

遇到同样的问题。显然,这个迭代应该只花费O(n)时间。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您描述的问题已经considered in PEP 380,并且指出您建议的递归yield from的优化可以通过Python语言实现来实现。

  

当生成器链很长时,使用专门的语法可以进行优化。例如,当递归遍历树结构时,会出现此类链。在链中上下传递 next ()调用和产生值的开销可能导致本应为O(n)的操作变成最坏的情况,即O(n ** 2)

显然,CPython 3无法对此进行优化,而yield from只是您在Python 2.7代码中具有显式循环的语法糖。