當我以不同的方式構建列表時,我注意到了一些有趣的行爲。 .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