有没有更快的方法来测试两个列表是否具有与==运算符中内置的Pythons完全相同的元素?

Zac*_*aro 8 python

如果我有两个列表,每个800个元素长并填充整数.有没有比使用内置==运算符更快的方式来比较它们具有完全相同的元素(如果没有,则为短路)?

a = [6,2,3,88,54,-486]
b = [6,2,3,88,54,-486]
a == b 
>>> True
Run Code Online (Sandbox Code Playgroud)

有什么比这更好的?

我很好奇只因为我有一个巨大的列表列表可供比较.

Cla*_*diu 10

我们不假设,但进行一些测试!

设置:

>>> import time
>>> def timeit(l1, l2, n):
        start = time.time()
        for i in xrange(n):
                l1 == l2
        end = time.time()
        print "%d took %.2fs" % (n, end - start)
Run Code Online (Sandbox Code Playgroud)

两个巨大的平等名单:

>>> hugeequal1 = [10]*30000
>>> hugeequal2 = [10]*30000
>>> timeit(hugeequal1, hugeequal2, 10000)
10000 took 3.07s
Run Code Online (Sandbox Code Playgroud)

第一个元素不相等的两个巨型列表:

>>> easydiff1 = [10]*30000
>>> easydiff2 = [10]*30000
>>> easydiff2[0] = 0
>>> timeit(easydiff1, easydiff2, 10000)
10000 took 0.00s
>>> timeit(easydiff1, easydiff2, 1000000)
1000000 took 0.14s
Run Code Online (Sandbox Code Playgroud)

所以看起来内置列表相等运算符确实做了短路.

编辑:有趣的是,使用该array.array模块并没有使它更快:

>>> import array
>>> timeit(hugeequal1, hugeequal2, 1000)
1000 took 0.30s
>>> timeit(array.array('l', hugeequal1), array.array('l', hugeequal2), 1000)
1000 took 1.11s
Run Code Online (Sandbox Code Playgroud)

numpy 但是会让你获得更好的加速:

>>> import numpy
>>> timeit(hugeequal1, hugeequal2, 10000)
10000 took 3.01s
>>> timeit(numpy.array(hugeequal1), numpy.array(hugeequal2), 10000)
10000 took 1.11s
Run Code Online (Sandbox Code Playgroud)