Python基准测试:为什么for in loop比simplewhile更快



我试图优化简单的字符计数函数。经过几次更改后,我决定检查时间,并期望使用基本"while"循环的函数比"for in"循环更快。

但令我惊讶的是,当循环比这里慢了将近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 Loop

在while循环中,解释器必须在每次迭代中检查表达式是否为真,因此它必须访问元素i和size并进行比较。

对于环路

另一方面,for循环不需要这样做,因为for循环是按照Chris_Rands已经指出的进行优化的

下面是我用python2.7:测试的结果

对于环路

测试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

While 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

也就是说:而循环要快得多

您的代码应该表示相同的功能,我已经为您修改了它以重新运行测试。

我可以看到,在进行基准测试时,您甚至使用了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

最新更新