【发布时间】:2017-02-05 19:20:09
【问题描述】:
def numbers(mi, ma):
return [n for n in range(mi, ma + 1)]
def gen(xs):
return (x for x in xs)
example = gen(numbers(10, 20))
在这个例子中,gen 可以提高numbers 的迭代性能吗?为什么(不)?
def numbersGen(mi, ma):
return gen([n for n in range(mi, ma + 1)]) # Generator from list comprehension?
Python 能像 Haskell 一样懒惰吗?
【问题讨论】:
-
Python 不能像 Haskell 那样“懒惰”,因为它的操作方式根本不同。在显示的代码中,列表是在 从数字返回之前创建的;它是与生成器一起包装的返回列表。 “直接”形式也是如此。如果生成器在某种程度上比已经实现的列表迭代“更快”,我会非常怀疑。
-
我了解Python的基本操作顺序;我想知道是否有优化好处或语法特殊性。
-
很少有 Python 可以做/做来优化这种情况 - 每个表达式都被急切地评估为一个值,因为它是“执行的”,然后才能提供下一个。这类似于大多数常见语言(从 JavaScript 到 C#),并且与 Haskell 是一种完全不同的基本方法,Haskell 是一种纯函数式语言。 Python 程序必须添加回选择惰性,例如使用没有预先实现源的生成器。
标签: python performance python-3.x generator