Frage

Ich habe versucht, den schnellsten Weg zu finden, um die Anzahl der Elemente in einer Liste zu zählen, die einem bestimmten Filter entspricht. In diesem Fall finden Sie, wie viele ungerade Zahlen in einer Liste enthalten sind.

Währenddessen war ich von den Ergebnissen des Vergleichs eines Listenverständnisses mit dem äquivalenten Generatorausdruck überrascht:

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 habe auch versucht, eine reguläre Liste und unterschiedliche Größen zu sein, aber in allen Fällen gewinnt das Listenverständnis.

Was macht die GenExP, die es tut, dass es langsamer ist als der ListComp, der eine neue Liste mit 1 Million Elementen erstellt ...?

(Übrigens, der schnellste Weg, den ich fand, war: x = 1; len(filter(x.__and__, L)). Und ja, ich weiß, dass das Schreiben von Code Kätzchen tötet, ich mache es zum Spaß)

War es hilfreich?

Lösung

Wenn im Wesentlichen unbegrenzte Speicher verfügbar ist (was in winzigen Benchmarks ausnahmslos der Fall ist, obwohl dies häufig nicht in realen Problemen ist! Keine Gedächtnisfragmentierung usw.), während Generatoren (intern) zusätzliche Anstrengungen benötigen, um diesen "großen Bündel" -Ansatz zu vermeiden, indem der Stapel-Rahmen-Status erhalten bleibt, um die Wiederaufnahme der Ausführung zu ermöglichen.

Ob ein Listenansatz oder ein Generatoransatz schneller sein wird in einem echten Programm hängt von der genauen Speichersituation ab, einschließlich der Fragmentierung, die in einem "Mikro-Benchmark" ungefähr unmöglich ist. Wenn Sie sich am Ende wirklich um Leistung kümmern, müssen Sie Ihre tatsächlichen Programme sorgfältig (und getrennt profilieren), nicht nur "Spielzeug" -Mikro-Benchmarks, im allgemeinen Fall.

Andere Tipps

Versuchen Sie das: generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top