Was ist der Unterschied zwischen diesen beiden Lösungen - Lambda oder Loop - Python

7

Ich möchte die Summe gerader Zahlen innerhalb einer Domain berechnen. Ich habe zwei Lösungen, aber ich bin mir ihrer Vor- und Nachteile nicht sicher. Welches ist die optimale Lösung?

%Vor%     
kilobaik 19.06.2010, 18:19
quelle

4 Antworten

12

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).

Amber 19.06.2010 18:21
quelle
7

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))

    
Alex Martelli 19.06.2010 19:40
quelle
2

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.

    
mikej 19.06.2010 18:26
quelle
2

+1 zu den anderen großen Antworten.

Bonus: der Generator Ausdruck ist schneller ...

%Vor%

Google Text & Tabellen .

    
bernie 19.06.2010 18:39
quelle

Tags und Links