簡體   English   中英

Python 基准測試:為什么 for in loop 比簡單的 while 更快?

[英]Python benchmark: Why for in loop is faster than simple while?

我試圖優化簡單的字符計數功能。 經過幾處更改后,我決定檢查時間並期望使用基本“while”循環的函數比“for in”循環更快。

但令我驚訝的是 while 循環比這里的 for 慢了將近 30%? 不應該是簡單的“while”循環,它具有較低的抽象(在內部做的較少)比“for in”快得多嗎?

import timeit

def faster_count_alphabet(filename):
    l = [0] * 128 # all ascii values 0 to 127
    with open(filename) as fh:
        a = fh.read()
        for chars in a:
            l[ord(chars)] += 1
    return l

def faster_count_alphabet2(filename):
    l = [0] * 128 # all ascii values 0 to 127
    with open(filename) as fh:
        a = fh.read()
        i = 0
        size = len(a)
        while(i<size):
            l[ord(a[i])] += 1
            i+=1
    return l

if __name__ == "__main__":
    print timeit.timeit("faster_count_alphabet('connect.log')", setup="from __main__ import faster_count_alphabet", number = 10)
    print timeit.timeit("faster_count_alphabet2('connect.log')", setup="from __main__ import faster_count_alphabet2", number = 10)

這是我得到的時間:

7.087787236
9.9472761879

循環

那么在你的 while 循環中,解釋器必須檢查每次迭代你的表達式是否為真,因此它必須訪問元素 i 和 size 並比較它們。

For 循環

另一方面,for 循環不需要它,因為 for 循環已經過優化,正如 Chris_Rands 已經指出的那樣

下面是我用python2.7測試的結果:

For 循環

測試1

python -mtimeit -s"d='/Users/xuejiang/go/src/main'.split('/')" "for i in range(len(d)):k=('index:',i,'value:',d[i])"

結果:

1000000 loops, best of 3: 0.747 usec per loop

測試2:

python -mtimeit -s"d='/Users/xuejiang/go/src/main'.split('/');i=0" "for v in d:k=('index:',i,'value:',v);i+=1"

結果:

1000000 loops, best of 3: 0.524 usec per loop

循環

測試

python -mtimeit -s"d='/Users/xuejiang/go/src/main'.split('/');i=0" "while i <len(d):k=('index:',i,'value:',d[i]);i+=1"

結果:

10000000 loops, best of 3: 0.0658 usec per loop

那就是:while 循環要快得多

您的代碼應該代表相同的功能,我已經為您修改了它以重新運行您的測試。

我可以看到您在進行基准測試時甚至使用優化版本的 foreach 循環而不是普通的 for 循環。

def faster_count_for_loop(filename):
l = [0] * 128 # all ascii values 0 to 127
with open(filename) as fh:
    a = fh.read()
    size = len(a)
    for i in range(size):
        l[ord(a[i])] += 1
return l

def faster_count_while_loop(filename):
l = [0] * 128 # all ascii values 0 to 127
with open(filename) as fh:
    a = fh.read()
    i = 0
    size = len(a)
    while(i < size):
        l[ord(a[i])] += 1
        i += 1
return l

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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