J'essayais de faire une comparaison pure-python (sans dépendances externes) de deux séquences. Ma première solution était:Performance de carte contre starmap?
list(map(operator.eq, seq1, seq2))
Je trouve starmap
fonction de itertools
, qui semblait assez semblable à moi. Mais il s'est avéré être 37% plus rapide sur mon ordinateur dans le pire des cas. Comme il n'a pas été évident pour moi, je l'ai mesuré le temps nécessaire pour récupérer 1 élément d'un générateur (ne sais pas si cette façon est correcte):
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)
Dans la récupération des éléments de la deuxième solution est 24% plus performante . Après cela, ils produisent tous deux les mêmes résultats pour list
. Mais quelque part, nous gagnons de plus de 13% dans le temps:
%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)
Je ne sais pas comment creuser plus profondément dans le profilage d'un tel code imbriqué? Donc ma question est pourquoi le premier générateur est-il plus rapide à récupérer et d'où nous gagnons 13% de plus dans la fonction list
?
EDIT: Ma première intention était d'effectuer la comparaison élément par élément au lieu de all
, de sorte que la fonction all
a été remplacé par list
. Ce remplacement n'affecte pas le rapport de synchronisation.
CPython 3.6.2 sur Windows 10 (64 bits)
Pourquoi ne pas simplement utiliser 'seq1 = = seq2'? –
@ Błotosmętek je vous remercie pour la correction! Ma première intention était la comparaison par élément au lieu de 'all', ce qui n'était pas évident dans ma question :) Vraiment si vous remplacez' list' au lieu de 'all', l'ordre des temps sera le même. – godaygo
Quelle version de Python? Et est-ce CPython? – MSeifert