我正在尝试优化简单字符计数功能。经过几次更改后,我决定检查时序,并期望使用基本的“ while”循环比“ for in”循环更快的功能。
但是令我惊讶的是while循环比这里慢了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
答案 0 :(得分:0)
同时循环
在while循环中,解释器必须检查每次迭代您的表达式是否为真,因此它必须访问元素i和size并进行比较。
用于循环
另一方面,for循环不需要这样做,因为正如Chris_Rands指出的那样,for循环已得到优化
答案 1 :(得分:0)
我使用python2.7进行测试的结果是
用于循环
test1
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
test2:
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循环要快得多