当我以不同的方式构建列表时,我注意到了一些有趣的行为。 .append
花费的时间比列表解析,这需要比map
长更长的时间,如下面的实验:循环结构中的加速
def square(x): return x**2
def appendtime(times=10**6):
answer = []
start = time.clock()
for i in range(times):
answer.append(square(i))
end = time.clock()
return end-start
def comptime(times=10**6):
start = time.clock()
answer = [square(i) for i in range(times)]
end = time.clock()
return end-start
def maptime(times=10**6):
start = time.clock()
answer = map(square, range(times))
end = time.clock()
return end-start
for func in [appendtime, comptime, maptime]:
print("%s: %s" %(func.__name__, func()))
的Python 2.7:
appendtime: 0.42632
comptime: 0.312877
maptime: 0.232474
的Python 3.3.3:
appendtime: 0.614167
comptime: 0.5506650000000001
maptime: 0.57115
现在,我非常清楚python 2.7中的range
会建立一个列表,所以我得到为什么在相应函数的时间之间存在差距python 2.7和3.3。我更关心的是append
,列表理解和map
之间的相对时间差异。首先,我认为这可能是因为map
和列表解析可以让解释者知道结果列表的最终大小,这将允许解释器malloc一个足够大的C数组来存储这个数组,名单。按照这个逻辑,列表解析和map
应该花费几乎相同的时间量。但是,时序数据显示在python 2.7中,listcomps的速度是〜1.36x的一样快,与append
一样快,map
的速度是listcomps的1.34倍。
更奇怪的是,在python 3.3中,listcomps的速度是append
的1.12倍,而map
实际上比listcomps的要慢。
很明显,map
和listcomps不“玩相同的规则”;很明显,地图利用了列表广告所不具备的功能。
有没有人可以揭示这些时间价值差异背后的原因?
强制性“你为什么不使用'timeit'?这对基准测试来说更好。”评论。 – delnan
@delnan - 我也在想这个:) – mgilson