【发布时间】:2011-05-23 02:49:44
【问题描述】:
似乎在生成器表达式 (test1) 周围使用 [] 比将它放在 list() 中 (test2) 表现得更好。当我只是将一个列表传递给 list() 以进行浅拷贝(test3)时,速度并不慢。这是为什么呢?
证据:
from timeit import Timer
t1 = Timer("test1()", "from __main__ import test1")
t2 = Timer("test2()", "from __main__ import test2")
t3 = Timer("test3()", "from __main__ import test3")
x = [34534534, 23423523, 77645645, 345346]
def test1():
[e for e in x]
print t1.timeit()
#0.552290201187
def test2():
list(e for e in x)
print t2.timeit()
#2.38739395142
def test3():
list(x)
print t3.timeit()
#0.515818119049
机器:64 位 AMD、Ubuntu 8.04、Python 2.7 (r27:82500)
【问题讨论】:
-
您的列表中只有 4 (!!) 个整数。您测量的时间可能主要是创建生成器等。
-
请注意,如果您使 x 甚至 稍微 大一些,例如
range(100),结果会发生巨大变化:t2 仅比 t1 慢 50%,而 t3 则遥遥领先。 -
test2 示例是生成器表达式转换为列表,而不是列表理解
-
我什至不会考虑前两个选项。它们只是冗余且更长(本质上,就像 Haskell 中的
map id一样,只是该语言具有智能编译器)。 -
Python 在不执行程序的情况下无法确定
list是内置的list函数。另一方面,[ .. ]将始终是一个列表,因此可以对其进行优化。
标签: python performance profiling