2024-09-27 18:06:33 发布
网友
如果我有两个列表,每一个都有800个元素,都是整数。有没有比使用内置的==运算符更快地比较它们是否具有完全相同的元素(如果没有,则短路)?在
==
a = [6,2,3,88,54,-486] b = [6,2,3,88,54,-486] a == b >>> True
还有比这更好的吗?在
我之所以好奇,是因为我有一个巨大的列表要比较。在
内置的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倍:
让我们不要假设,而是运行一些测试!在
设置:
>>> 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)
两个巨大的平等名单:
第一个元素不相等的两个巨大列表:
>>> 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模块并没有使它更快:
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确实能给你带来很好的加速效果,不过:
numpy
>>> import numpy >>> timeit(hugeequal1, hugeequal2, 10000) 10000 took 3.01s >>> timeit(numpy.array(hugeequal1), numpy.array(hugeequal2), 10000) 10000 took 1.11s
内置的Cpthon特性(我假设你正在使用)倾向于在C.编写,这样你就不会更快地得到它,除非你编写一些C/C++代码,这些代码利用了你的上下文的某些方面。在
Numpy可以将此速度提高10倍,这一点尤其重要,因为您的列表是fix(整数)类型。在
在纯python中,每个比较都必须跟随对下一个元素的引用,检查类型等。在numpy中,只需要增加一个指针。在
下面是一个比较:
使用numpy的结果是10倍:
^{pr2}$让我们不要假设,而是运行一些测试!在
设置:
两个巨大的平等名单:
^{pr2}$第一个元素不相等的两个巨大列表:
因此,似乎内置的列表相等运算符确实做了短路。在
编辑:有趣的是,使用
array.array
模块并没有使它更快:numpy
确实能给你带来很好的加速效果,不过:相关问题 更多 >
编程相关推荐