Der zweite sollte eigentlich nur ein Generator sein, kein Listenverständnis (da Sie eigentlich keine Liste erstellen müssen, um die Ausgabe eines Generators summieren zu können):
%Vor%Es ist der jetzt bevorzugte ("pythonische") Weg, um diese Aufgabe zu erfüllen.
Die Verwendung eines Listenverständnisses (das []
, Ihr ursprüngliches Cal2
) ist von Nachteil, weil es tatsächlich ein zurückzusendendes Listenobjekt erstellt, das Overhead hat.
Die Verwendung von filter
(Ihr Cal1
) ist äquivalent zu einem Generator (die nicht []
-Version), erfordert aber ein wenig mehr Tipparbeit und liest nicht ganz so gut wie mit einem Generator Ausdruck (der Code, den ich oben gepostet habe).
Hier sind die Geschwindigkeiten der verschiedenen Versionen auf einem alten Mac-Laptop:
%Vor% Beachten Sie, dass, während die genexp-Version zweifellos cooler ist, das listcomp marginal schneller ist (wahrscheinlich nicht genug, um sich Sorgen zu machen, es sei denn, dieser Code befindet sich in einer engen inneren Schleife, die Sie anstreben Optimiere die Rotze aus ;-). Wie üblich, ist die lambda
-basierte Version wesentlich langsamer, wie andere bereits erwähnt haben - lambda
ist eine Art "schlechte Beziehung" in Python :-(. ((Nicht dass eine def
ined-Funktion merklich funktioniert) besser hier, entweder))
Ihre zweite Art, dies zu tun, ist das sogenannte Listenverständnis. Listen-Comprehensions können verwendet werden, um die Dinge zu erreichen, die Sie zuvor für filter
und map
vor ihrer Einführung in die Sprache verwenden würden. Siehe diese vorherige Frage für eine Diskussion über Listen-Comprehensions vs. map, die ähnlich wie Sie ist Fragen.
Wie Amber schreibt, ist der empfohlene pythonische Weg, dies zu tun, die Verwendung eines Generators. Mit den Listenkompromittierungen wird Ihre gesamte gefilterte Liste erstellt und dann summiert. Mit dem Generator wird es summiert, ohne dass es die volle Liste im Speicher hat. Dies macht einen größeren Unterschied, wenn Sie mit mehr als 10 Elementen arbeiten.
Tags und Links python