Wie kann ich diese Liste schneller machen?

7
%Vor%

Wie mache ich diese Funktion schneller?

    
user849364 18.07.2011, 04:49
quelle

8 Antworten

15
%Vor%

Dadurch wird nur ein Durchlauf durch die Liste durchgeführt, und die Operationen werden auf ein Minimum beschränkt. Ich habe das auf einer Wortliste mit 1.1M Einträgen, 29k eindeutigen Wörtern gemessen, und es war fast doppelt so schnell wie Patrick's Antwort. Auf einer Liste von 10k Wörtern, 2k eindeutig, war es mehr als 300x schneller als der OP-Code.

Damit Python-Code schneller wird, müssen Sie zwei Regeln beachten: Verwenden Sie den besten Algorithmus und vermeiden Sie Python.

Auf der Vorderseite des Algorithmus ist es die Hauptsache, die dies beschleunigt, wenn man die Liste einmal anstelle von N + 1 Mal wiederholt (N = Anzahl der eindeutigen Wörter).

Auf der Vorderseite von "Python vermeiden": Ich möchte, dass Ihr Code so oft wie möglich in C ausgeführt wird. Die Verwendung von defaultdict ist also besser als ein Diktat, bei dem Sie explizit prüfen, ob der Schlüssel vorhanden ist. defaultdict prüft das für Sie, aber in C, in der Python-Implementierung. enumerate ist besser als for i in range(len(li)) , da es weniger Python-Schritte gibt. Und enumerate(li, 1) macht das Zählen bei 1, anstatt irgendwo in der Schleife ein Python +1 zu haben.

Bearbeitet: Dritte Regel: Verwenden Sie PyPy. Mein Code geht auf PyPy doppelt so schnell wie auf 2.7.

    
Ned Batchelder 18.07.2011 11:31
quelle
5

Basierend auf @Ned Batchelders Lösung, aber ohne Dummy-Listen zu erstellen:

%Vor%     
Neil G 18.07.2011 17:04
quelle
3

Ich bin nicht sicher, ob dies schneller ist als die Verwendung eines Sets, aber es erfordert nur einen Durchlauf durch die Liste:

%Vor%

Dies gibt eine modifizierte Version von wordmap zurück, wobei die mit jedem Schlüssel verknüpften Werte ein Tupel der durchschnittlichen Position und der Anzahl der Vorkommen sind. Sie könnten dies natürlich leicht in die Form der ursprünglichen Ausgabe umwandeln, aber das würde einige Zeit dauern.

Der Code behält im Grunde einen laufenden Durchschnitt, während er durch die Liste iteriert und jedes Mal neu berechnet, indem er einen gewichteten Durchschnitt nimmt.

    
Patrick 18.07.2011 10:32
quelle
1

Verwenden Sie einen Satz:

%Vor%     
OneOfOne 18.07.2011 04:53
quelle
1

Das erste, was einem einfällt, ist die Verwendung eines Sets, um doppelte Wörter zu entfernen:

%Vor%

Wenn Sie sich jedoch Sorgen um die Geschwindigkeit machen, müssen Sie die Funktion im Allgemeinen profilieren, um zu sehen, wo sich der Engpass befindet, und dann versuchen, diesen Engpass zu reduzieren.

    
Blair 18.07.2011 04:53
quelle
1

Verwenden Sie frozenset anstelle von dict , da Du machst nichts mit den Werten:

%Vor%     
Adam Rosenfield 18.07.2011 04:53
quelle
0

Listenverständnis verwenden:

%Vor%     
riza 18.07.2011 07:44
quelle
-1

Einleiner -

%Vor%

Was ich in der letzten Zeile mache, ist ein Wörterbuchverständnis, ähnlich einem Listenverständnis.

    
Pushpak Dagade 18.07.2011 06:47
quelle