Python基准测试:为什么for in loop比简单循环快?

时间:2018-12-17 09:32:37

标签: python performance benchmarking

我正在尝试优化简单字符计数功能。经过几次更改后,我决定检查时序,并期望使用基本的“ 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

2 个答案:

答案 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循环要快得多