簡體   English   中英

Python3與Python2列表/生成器范圍性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM