Python - VS-Erweiterungseffizienz anfügen

9

Hier ist ein Code, den ich mit Python geschrieben habe:

%Vor%

Wie Sie sehen können, versucht der Code wirklich so effizient wie möglich zu sein.

Gibt es einen Unterschied, wenn ich list.append zweimal oder list.extend nur einmal verwende? Ich weiß, es können kleine Unterschiede sein, aber ich würde das gerne wissen:)

    
Infinity 21.01.2013, 19:50
quelle

3 Antworten

16
%Vor%

Hier ist ein einfacher Benchmark. Meine Ergebnisse (os-X, 10.5.8, core2duo, FWIW):

%Vor%

Und die gleiche Reihenfolge der Ergebnisse meiner Linux-Box (Ubuntu, x86-64 Core i7):

%Vor%

Für mich heißt das, dass extend schneller ist als append , aber das Erstellen eines list ist relativ teuer im Vergleich zum Erstellen eines tuple

BEARBEITEN

In den folgenden Kommentaren wurde darauf hingewiesen, dass der Interpreter aufgrund der Unveränderlichkeit von Tupeln die Erstellung des Tupels optimieren kann (er erstellt das Tupel einmal und verwendet es wieder und wieder). Wenn wir den Code zu:

ändern %Vor%

Die Zeiten sind praktisch identisch:

%Vor%

Obwohl tuple immer noch die Listenversion schlägt und die append -Version für alle Versuche, die ich gemacht habe, kaum überschreitet.

Eine Sache, die ich davon wegnehme, ist, dass wenn Sie über ein Objekt iterieren, das aus allen Literalen besteht, wählen Sie eine tuple über eine list . Wenn es nicht nur aus Literalen besteht, dann spielt es keine Rolle, ob Sie list oder tuple wählen.

    
mgilson 21.01.2013, 19:56
quelle
9

Es sollte auch darauf hingewiesen werden, dass die Antwort auf diese Frage von der kleinen Größe der Liste / des Tupels abhängt, die bei jeder Iteration hinzugefügt wird. Bei größeren Listen ist extend eindeutig besser (und Listen vs. Tupel machen keinen Unterschied). Beginnend mit mgilson antworten , ich habe das Verhalten für Sammlungen mit 600 Artikeln überprüft, anstatt 2: Append 600 mal aufzurufen, dauert 8 mal so lange wie extend() mit einer manuell definierten Liste / Tupel (d. H.% Co_de%):

%Vor%

Der Großteil dieser fünf Sekunden ist eigentlich die Listen / Tupel-Erstellung. Die Vorbereitung vor dem Aufruf von [v,v,v,v,v,v,v...] bringt Zeiten für die Erweiterung auf

%Vor%

für Liste bzw. Tupel.

Für einen realistischeren (und faireren) Fall kann man dynamisch die Daten innerhalb des Funktionsaufrufs generieren:

%Vor%

(Append wird sowohl über For-Loop- als auch Listen-Verständnis implementiert, um Effizienzunterschiede zwischen den beiden Arten der Schleifenbildung auszuschließen.)

Die Zeiten sind:

%Vor%

Wie wir sehen können, ist die Erweiterung mit dem Listenverständnis immer noch mehr als zwei Mal schneller als das Anhängen. Außerdem erscheint das Tupelverständnis merklich langsamer als das Listenverständnis, und timeit führt nur unnötigen Listenerstellungsaufwand ein.

    
Marc Schulder 03.12.2015 21:51
quelle
0

Sie nehmen genau die gleiche Zeit.

Hier ist die Zeit für Ihren Code:

Mit dividor_list.extend([i/j,j])

%Vor%

Mit dividor_list.append(i/j); dividor_list.append(j)

%Vor%     
ATOzTOA 21.01.2013 19:59
quelle

Tags und Links