【发布时间】:2013-04-24 19:29:30
【问题描述】:
我在 Windows 上使用 Python 3.3.1 64 位,这段代码 sn-p:
len ([None for n in range (1, 1000000) if n%3 == 1])
与这个相比,在 136 毫秒内执行:
sum (1 for n in range (1, 1000000) if n%3 == 1)
在 146 毫秒内执行。在这种情况下,生成器表达式不应该更快或与列表理解的速度相同吗?
我引用 Guido van Rossum From List Comprehensions to Generator Expressions:
...Python 3 中的列表推导和生成器表达式都是 实际上比它们在 Python 2 中更快! (并且不再有 两者之间的速度差异。)
编辑:
我用timeit 测量了时间。我知道这不是很准确,但我只关心这里的相对速度,并且当我使用不同数量的迭代进行测试时,列表理解版本的时间一直在缩短。
【问题讨论】:
-
你是如何测量速度差异的?
-
7% 的差异是微不足道的——尤其是如果您的计时不是很准确。 (使用
time或clock而不是timeit的典型幼稚实现只需要 1/8 秒就很容易产生远远大于 7% 的错误。) -
您为什么将
len与sum进行比较?计数元素比添加它们的内容要快得多。 -
有点令人惊讶的是,在 PyPy 1.9.0(即 Python 2.7.2,没有任何现代 genexp 改进)中,genexp 版本几乎快了一倍(26.6ms vs. 49.7 毫秒)。加法可能无关紧要(因为在 PyPy 中,整数加法比迭代快几个数量级),但我仍然对结果感到有些惊讶。
-
@MartijnPieters 我使用
timeit- 编辑了问题。
标签: python python-3.x list-comprehension generator-expression