Ich habe versucht, eine reine Python (ohne externe Abhängigkeiten) elementweisen Vergleich von zwei Sequenzen zu machen. Meine erste Lösung war:Leistung der Karte vs Starmap?
list(map(operator.eq, seq1, seq2))
Dann fand ich starmap
Funktion von itertools
, was mir ziemlich ähnlich zu sein schien. Aber es stellte sich heraus, dass es im schlimmsten Fall 37% schneller auf meinem Computer war. Da es nicht mir klar war, habe ich die Zeit, die notwendig sind 1-Element von einem Generator zum Abrufen (weiß nicht, ob diese Art und Weise richtig ist):
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)
Elemente der zweiten Lösung 24% performanter In Abrufen ist . Danach ergeben beide die gleichen Ergebnisse für list
. Aber von irgendwo gewinnen wir zusätzliches 13% in der Zeit:
%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)
Ich weiß nicht, wie tiefer solchen verschachtelten Code in Profilierung zu graben? Also meine Frage warum ist der erste Generator so schneller beim Abrufen und woher bekommen wir extra 13% in list
Funktion?
EDIT: Meine erste Absicht war, elementweise Vergleich statt all
, durchzuführen, um die all
Funktion mit list
ersetzt wurde. Dieser Austausch hat keinen Einfluss auf das Timing-Verhältnis.
CPython 3.6.2 unter Windows 10 (64-Bit)
Warum nicht einfach verwenden 'seq1 = = seq2'? –
@ Błotosmętek danke für die Korrektur! Meine erste Absicht war der elementweise Vergleich anstelle von 'all', was aus meiner Frage nicht ersichtlich war :) Wirklich, wenn Sie' list' statt 'all' ersetzen, wird die Reihenfolge der Zeiten gleich sein. – godaygo
Welche Python-Version? Und ist das CPython? – MSeifert