[英]Python3 vs Python2 list/generator range performance
我有這個簡單的函數,它分區列表並返回列表中的索引i,使索引小於i的元素小於list [i],索引大於i的元素更大。
def partition(arr):
first_high = 0
pivot = len(arr) - 1
for i in range(len(arr)):
if arr[i] < arr[pivot]:
arr[first_high], arr[i] = arr[i], arr[first_high]
first_high = first_high + 1
arr[first_high], arr[pivot] = arr[pivot], arr[first_high]
return first_high
if __name__ == "__main__":
arr = [1, 5, 4, 6, 0, 3]
pivot = partition(arr)
print(pivot)
OS X上的python 2.7.6的python 3.4運行時間要大得多:
time python3 partition.py
real 0m0.040s
user 0m0.027s
sys 0m0.010s
time python partition.py
real 0m0.031s
user 0m0.018s
sys 0m0.011s
在ubuntu 14.04 /虛擬機上也是如此
python3:
real 0m0.049s
user 0m0.034s
sys 0m0.015s
蟒蛇:
real 0m0.044s
user 0m0.022s
sys 0m0.018s
python3本身是否比python2.7慢,或者是否對代碼進行了任何特定的優化,使得運行速度與python2.7一樣快
正如評論中所提到的,您應該使用timeit
而不是使用OS工具進行基准測試。
我的猜測是該range
的功能可能是在Python 3.在Python 2執行慢一點它只是返回一個列表 ,在Python 3它返回一個range
,它們的行為或多或少就像一台發電機。 我做了一些基准測試,這是結果,這可能暗示你正在經歷的事情:
python -mtimeit "range(10)"
1000000 loops, best of 3: 0.474 usec per loop
python3 -mtimeit "range(10)"
1000000 loops, best of 3: 0.59 usec per loop
python -mtimeit "range(100)"
1000000 loops, best of 3: 1.1 usec per loop
python3 -mtimeit "range(100)"
1000000 loops, best of 3: 0.578 usec per loop
python -mtimeit "range(1000)"
100000 loops, best of 3: 11.6 usec per loop
python3 -mtimeit "range(1000)"
1000000 loops, best of 3: 0.66 usec per loop
正如您所看到的,當提供給range
輸入很小時 ,它在Python 2中往往很快。如果輸入增長,那么Python 3的range
表現得更好。
我的建議:測試更大數組的代碼,有一百或一千個元素。
實際上,我進一步測試了元素的完整迭代。 結果完全支持Python 2:
python -mtimeit "for i in range(1000):pass"
10000 loops, best of 3: 31 usec per loop
python3 -mtimeit "for i in range(1000):pass"
10000 loops, best of 3: 45.3 usec per loop
python -mtimeit "for i in range(10000):pass"
1000 loops, best of 3: 330 usec per loop
python3 -mtimeit "for i in range(10000):pass"
1000 loops, best of 3: 480 usec per loop
我的結論是,迭代列表可能比通過生成器更快。 雖然后者在內存消耗方面肯定更有效。 這是速度和記憶之間權衡的典型例子。 雖然速度差異本身並不大 (小於幾毫秒)。 因此,您應該重視這一點,並為您的計划做些什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.