Erstellen einer leeren Liste in Python


243

Was ist der beste Weg, um eine neue leere Liste in Python zu erstellen?

l = [] 

oder

l = list()

Ich frage dies aus zwei Gründen:

  1. Technische Gründe, welche schneller sind. (Das Erstellen einer Klasse verursacht Overhead?)
  2. Lesbarkeit des Codes - welches ist die Standardkonvention.

4
"schneller"? Warum bist du nicht timeit gelaufen?
S.Lott

Antworten:


335

So können Sie testen, welcher Code schneller ist:

% python -mtimeit  "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop

% python -mtimeit  "l=list()"
1000000 loops, best of 3: 0.297 usec per loop

In der Praxis ist diese Initialisierung jedoch höchstwahrscheinlich ein äußerst kleiner Teil Ihres Programms. Daher ist es wahrscheinlich falsch, sich darüber Sorgen zu machen.

Die Lesbarkeit ist sehr subjektiv. Ich bevorzuge [], aber einige sehr sachkundige Leute, wie Alex Martelli, bevorzugen, list()weil es aussprechbar ist .


12
Wow, danke für die Profilerstellung. Ich wollte schon immer wissen, wie es gemacht wurde.
user225312

Warum list('')geben []statt ['']?
Chris_Rands

Dies liegt daran, dass Sie mit dieser func make-Liste aus iterierbaren Typen nicht mehr als ein Argument einfügen konnten. (Versuchen Sie zu tippen list('abcd')und Sie verstehen alles)
Ivan Lavrenov

133

list()ist von Natur aus langsamer als [], weil

  1. Es gibt eine Symbolsuche (Python kann nicht im Voraus wissen, ob Sie die Liste nicht einfach neu definiert haben, um etwas anderes zu sein!).

  2. es gibt Funktionsaufruf,

  3. dann muss überprüft werden, ob ein iterierbares Argument übergeben wurde (damit eine Liste mit Elementen daraus erstellt werden kann) ps. Keine in unserem Fall, aber es gibt eine "Wenn" -Prüfung

In den meisten Fällen macht der Geschwindigkeitsunterschied jedoch keinen praktischen Unterschied.


38
+1: Es fühlt sich gut an zu verstehen, warum list()langsamer ist als []!
Eric O Lebigot

2
Im Falle list()muss nur geprüft werden, ob überhaupt ein Argument vorhanden ist ... "Überprüfen, ob iterabel" und "Liste mit Elementen erstellen" passieren einfach nicht; Sie gelten nur, wenn es ein Argument gibt. Es ist sogar möglich, dass der C-Code für []denselben C-Code wie aufruft list(). In jedem Fall wäre die mit (c) verbundene Zeit im Vergleich zu (a) + (b) winzig.
John Machin

1
@ John Machin - Entschuldigung für die Verwirrung, was ich in (c) gemeint habe war, dass es überprüfen muss, ob es Argumente gab, ja. Der Rest war darüber, was passieren wird, wenn es Streit gibt, den es in unserem Fall nicht gibt
Nas Banov

16

Ich benutze [].

  1. Es ist schneller, weil die Listennotation ein Kurzschluss ist.
  2. Das Erstellen einer Liste mit Elementen sollte ungefähr so ​​aussehen wie das Erstellen einer Liste ohne. Warum sollte es einen Unterschied geben?

3

Ich weiß es nicht wirklich, aber es scheint mir aus Erfahrung, dass jpcgt tatsächlich richtig ist. Folgendes Beispiel: Wenn ich folgenden Code verwende

t = [] # implicit instantiation
t = t.append(1)

Wenn ich im Interpreter t anrufe, bekomme ich nur "t" ohne Liste, und wenn ich etwas anderes anhänge, z

t = t.append(2)

Ich erhalte die Fehlermeldung "Das Objekt 'NoneType' hat kein Attribut 'Anhängen'". Wenn ich jedoch die Liste von erstelle

t = list() # explicit instantiation

dann funktioniert es gut.


15
Dies liegt daran , dass t.append(1)Änderungen tan Ort und Stelle vorgenommen werden und nichts zurückgegeben werden, aber NoneSie weisen dies Nonezu t. Also tbezieht sich jetzt auf Nonestatt auf die Liste. Ihr Fehler hier war, t=t.append(1)statt nur zu schreiben t.append(1). Sie werden das gleiche Verhalten bei bemerken list(), daher gibt es hier keinen Unterschied.
Darkonaut

1

Nur um die Antwort von @Darkonaut hervorzuheben weil ich denke, dass sie besser sichtbar sein sollte.

new_list = []oder new_list = list()sind beide in Ordnung (ignorieren die Leistung), append()kehren aber zurück None, als Ergebnis können Sie dies nicht tunnew_list = new_list.append(something .

Ich bin sehr verwirrt über eine solche Entscheidung vom Typ Rückkehr. Yuck.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.