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:)
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
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.
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%):
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
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.
Tags und Links python performance