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

2024-09-27 18:06:33 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有两个列表,每一个都有800个元素,都是整数。有没有比使用内置的==运算符更快地比较它们是否具有完全相同的元素(如果没有,则短路)?在

a = [6,2,3,88,54,-486]
b = [6,2,3,88,54,-486]
a == b 
>>> True

还有比这更好的吗?在

我之所以好奇,是因为我有一个巨大的列表要比较。在


Tags: true元素列表运算符整数内置短路
3条回答

内置的Cpthon特性(我假设你正在使用)倾向于在C.编写,这样你就不会更快地得到它,除非你编写一些C/C++代码,这些代码利用了你的上下文的某些方面。在

Numpy可以将此速度提高10倍,这一点尤其重要,因为您的列表是fix(整数)类型。在

在纯python中,每个比较都必须跟随对下一个元素的引用,检查类型等。在numpy中,只需要增加一个指针。在

下面是一个比较:

import numpy as np
from timeit import timeit

N = 10**7

p0 = list(range(N))
p1 = list(range(N))

n0 = np.arange(N)
n1 = np.arange(N)

number = 500
t = timeit("p0==p1", setup="from __main__ import p0, p1", number=number)
print "pure python time =", t/number

number = 500
t = timeit("(n0==n1).all()", setup="from __main__ import n0, n1", number=number)
print "numpy time =", t/number

使用numpy的结果是10倍:

^{pr2}$

让我们不要假设,而是运行一些测试!在

设置:

>>> 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)

两个巨大的平等名单:

^{pr2}$

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

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

因此,似乎内置的列表相等运算符确实做了短路。在

编辑:有趣的是,使用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

numpy确实能给你带来很好的加速效果,不过:

>>> import numpy
>>> timeit(hugeequal1, hugeequal2, 10000)
10000 took 3.01s
>>> timeit(numpy.array(hugeequal1), numpy.array(hugeequal2), 10000)
10000 took 1.11s

相关问题 更多 >

    热门问题