我正在编写一个递归生成器函数,基本上看起来像这样:
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)时间。有什么想法吗?
答案 0 :(得分:0)
您描述的问题已经considered in PEP 380,并且指出您建议的递归yield from
的优化可以通过Python语言实现来实现。
当生成器链很长时,使用专门的语法可以进行优化。例如,当递归遍历树结构时,会出现此类链。在链中上下传递 next ()调用和产生值的开销可能导致本应为O(n)的操作变成最坏的情况,即O(n ** 2)
显然,CPython 3无法对此进行优化,而yield from
只是您在Python 2.7代码中具有显式循环的语法糖。