Optimieren Sie Filterlisten in Python 2.7

7

Ich muss eine große Liste mehrmals filtern, aber es geht mir sowohl um die Einfachheit des Codes als auch um die Effizienz der Ausführung. Um ein Beispiel zu geben:

%Vor%

Ich mache mir Sorgen, dass ich über die Kleiderliste iteriere, obwohl sie tatsächlich schon überholt wurde. Ich möchte auch die zwei Filteroperationen getrennt halten, da sie zu zwei verschiedenen Klassen gehören, und ich möchte die erste Lambda-Funktion in der Klasse hats nicht duplizieren.

%Vor%

Ich habe Generatorfunktionen untersucht, da sie wie der Weg zu gehen schienen, aber ich habe noch nicht herausgefunden, wie.

    
cammil 27.04.2012, 11:27
quelle

3 Antworten

23

Zunächst wird die Verwendung von filter / lambda combination veraltet sein. Der aktuelle funktionale Programmierstil wird in Python Functional Programming HOWTO beschrieben.

Zweitens, sollten Sie sich mit der Effizienz befassen, anstatt Listen zu konstruieren, sollten Sie Generatoren zurückgeben. In diesem Fall sind sie einfach genug, Generatorausdrücke zu verwenden.

%Vor%

Oder wenn Sie bevorzugen, wahre Generatoren (angeblich mehr Python):

%Vor%

Wenn Sie aus irgendeinem Grund manchmal list anstatt iterator benötigen, können Sie die Liste durch einfaches Casting aufbauen:

%Vor%

Beachten Sie, dass oben nicht eine Liste von Kleidungsstücken erstellt, daher liegt die Effizienz in der Nähe Ihrer doppelten Codeversion.

    
vartec 27.04.2012, 11:37
quelle
4

Um es in nur einem Durchgang (Pseudocode) zu tun:

%Vor%

Um es in einem großen Pass und einem kleineren Pass zu tun (Liste Comprehensions):

%Vor%

Wenn Sie die ganze Liste erstellen möchten, ist es sinnlos, einen Generator-Ausdruck für die faule Auswertung zu verwenden, weil Sie nicht faul sind.

Wenn Sie sich nur mit ein paar Dingen auf einmal beschäftigen möchten oder Ihre Speicherkapazität beschränkt ist, verwenden Sie die Generatorlösung von @ vartec.

    
Li-aung Yip 27.04.2012 11:37
quelle
3

Ich war auf der Suche nach ähnlichen Filtern von Listen, wollte aber ein etwas anderes Format haben als das, was hier vorgestellt wurde.

Der oben genannte Aufruf get_hats() ist gut, aber in seiner Wiederverwendung begrenzt. Ich suchte nach etwas mehr wie get_hats(get_clothes(all_things)) , wo Sie eine Quelle (all_things) und dann so wenige oder so viele Ebenen der Filter get_hats() , get_clothes() angeben können, wie Sie möchten.

Ich habe einen Weg gefunden, dies mit Generatoren zu tun:

%Vor%

Dies kann dann aufgerufen werden mit:

%Vor%

Ich habe die ursprünglichen Lösungen, die Lösung von vartec und diese zusätzliche Lösung getestet, um die Effizienz zu sehen, und war von den Ergebnissen etwas überrascht. Code wie folgt:

Setup:

%Vor%

Ursprüngliche Lösungen:

%Vor%

Meine Lösung:

%Vor%

vartecs Lösung:

%Vor%

Timing-Code:

%Vor%

Ergebnisse:

%Vor%

Die Generatorausdrücke scheinen etwas schneller zu sein, der Unterschied in der Zeit zwischen meinen und vartecs Lösungen ist wahrscheinlich nur Rauschen. Aber ich bevorzuge die Flexibilität, beliebige Filter in beliebiger Reihenfolge anwenden zu können.

    
Allan5 30.10.2012 03:20
quelle

Tags und Links