Ich habe versucht, die Anzahl der Elemente in einer Liste, die einem bestimmten Filter entsprechen, am schnellsten zu ermitteln. In diesem Fall finden Sie, wie viele ungerade Zahlen in einer Liste enthalten sind.Warum funktioniert dieses Genexp schlechter als ein Listenverständnis?
Während dies zu tun, wurde ich von den Ergebnissen überrascht eine Liste Verständnis vs dem äquivalenten Generator Ausdruck zu vergleichen:
python -m timeit -s "L = xrange(1000000)" "sum([1 for i in L if i & 1])"
10 loops, best of 3: 109 msec per loop
python -m timeit -s "L = xrange(1000000)" "sum(1 for i in L if i & 1)"
10 loops, best of 3: 125 msec per loop
ich auch versucht habe, mit L eine reguläre Liste, und verschiedenen Größen zu sein, aber in allen Fälle gewinnt das Listenverständnis.
Was macht das Genexp, das es langsamer im Vergleich zu dem Listcomp verursacht, das eine neue Liste mit 1 Million Elementen erstellt ...?
(Btw, der schnellste Weg, ich fand, war: x = 1; len(filter(x.__and__, L))
Und ja, ich weiß, das Schreiben von Code wie das tötet Kätzchen, ich es für den Spaß von ihm mache.)
1+ umkehren. Es kann auch angemerkt werden, dass Generatoren in vielen Fällen aufgrund ihrer stromähnlichen Natur weniger Speicher benötigen. Erwägen Sie, jede Zeile in einer Datei zu einer Liste zu lesen und vergleichen Sie diese Zeile mit jeder Zeile, um damit zu arbeiten und sie zu verwerfen. – Skurmedel