列表成员资格检查与For循环性能

时间:2019-07-25 01:38:29

标签: python performance

与此帖子相关:If in List vs For loop (performance)

在定时执行时,test1()的速度至少是test2()的两倍。 test2()中的行较少。是因为这个吗?除此之外,它也是“ Python化”的做事方式。 'in'是否比类似的循环结构更有效率?出于性能原因,列表和dict检查是否应该优先于循环?

import timeit

a = [n for n in range(1, 1000)]
s = a[len(a) - 1]

def test1():
    for i in a:
        if i == s:
            break

def test2():
    if s in a:
        pass

if __name__ == '__main__':
    n = 10000

    print("test1 milli-sec per loop: ", timeit.timeit("test1()",
                                                      setup="from __main__ import test1", number=n) / n * 1000)
    print("test2 milli-sec per loop: ", timeit.timeit("test2()",
                                                      setup="from __main__ import test2", number=n) / n * 1000)

1 个答案:

答案 0 :(得分:1)

这两个正在执行的代码本质上是完全相同的,但有一个主要区别:in将循环推到C级(假设使用CPython),而第二个循环显然是Python。

C的执行速度明显快于Python,从而为您带来了性能差异。通常,如果只想检查成员资格(TrueFalse),请使用第一个选项,但是如果您想做更复杂的事情,例如获取索引(使用{ {1}})并执行进一步的操作,请使用第二个。对于小清单,时间差很小,您可以自由使用任何一种形式。