我试图做一个纯python(没有外部依赖)元素明智的比较两个序列。我的第一个解决方案是:地图vs星图的性能?
list(map(operator.eq, seq1, seq2))
后来我发现starmap
功能从itertools
,这似乎非常相似我。但在最糟糕的情况下,我的电脑速度竟然快了37%。由于这不明显给我,我测量所需的时间从发电机获取1元(不知道这种方式是正确的):
from operator import eq
from itertools import starmap
seq1 = [1,2,3]*10000
seq2 = [1,2,3]*10000
seq2[-1] = 5
gen1 = map(eq, seq1, seq2))
gen2 = starmap(eq, zip(seq1, seq2))
%timeit -n1000 -r10 next(gen1)
%timeit -n1000 -r10 next(gen2)
271 ns ± 1.26 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
208 ns ± 1.72 ns per loop (mean ± std. dev. of 10 runs, 1000 loops each)
在检索元素的第二种解决方案是24%更好的性能。之后,它们都产生list
的相同结果。但是,从什么地方,我们及时获得额外的13%:
%timeit list(map(eq, seq1, seq2))
%timeit list(starmap(eq, zip(seq1, seq2)))
5.24 ms ± 29.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
3.34 ms ± 84.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
我不知道如何在这样的嵌套代码分析的深入挖掘?所以我的问题是,为什么第一台发电机在检索和获取list
函数中额外的13%时速度如此之快?
编辑: 我的第一个目的是为了执行逐元素的比较,而不是all
,所以all
功能用list
替换。此替换不会影响时间比例。
在Windows 10(64位)的CPython 3.6.2
为什么不直接使用'SEQ1 = = seq2'? –
@Błotosmętek谢谢你的纠正!我的第一个意图是元素比较,而不是'all',这在我的问题中并不明显:)真的,如果你用'list'而不是'all'来代替'all',那么次数的顺序将是相同的。 – godaygo
什么是Python版本?这是CPython吗? – MSeifert