【问题标题】:Can generatorizing a list improve Python performance?生成列表可以提高 Python 性能吗?
【发布时间】: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


【解决方案1】:

在这种特殊情况下,range 已经像您希望的那样懒惰了。没有理由进一步将其输出包装在间接层中。当然,Python 生成器与 Haskell 懒惰的常见警告也适用;也就是说,多次迭代,或者从特定点继续多次,在 Python 中是很痛苦的,但内存使用通常更容易预测。

【讨论】:

  • @mentalCase 很高兴知道!我已经更新了我的答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多