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