Warum ist eine Liste, begreifen so viel schneller als das Anhängen an eine Liste?
Ich Frage mich, warum die list-comprehension ist so viel schneller als das Anhängen einer Liste an. Ich dachte, der Unterschied ist nur ausdrucksstark, aber es ist nicht.
>>> import timeit
>>> timeit.timeit(stmt='''\
t = []
for i in range(10000):
t.append(i)''', number=10000)
9.467898777974142
>>> timeit.timeit(stmt='t= [i for i in range(10000)]', number=10000)
4.1138417314859
Die Liste Verständnis ist 50% schneller. Warum?
- Fragen: Sind Liste-Verstehens und funktionale Funktionen schneller als "for-Schleifen"?, Python list comprehension teuer
- warum ist es verwunderlich, dass in der Liste das Verständnis ist schneller? ist das nicht ein wesentlicher Grund für die Liste Verstehens existieren?
InformationsquelleAutor rafaelc | 2015-05-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Liste Verständnis ist im Grunde nur ein "syntaktischer Zucker" für die regelmäßige
for
Schleife. In diesem Fall ist der Grund dafür, dass es besser ist, weil Sie nicht brauchen, um zu laden das append-Attribut von der Liste aus, und rufen Sie es als eine Funktion, die bei jedem Durchlauf. In anderen Worten und im Allgemeinen, Liste Verstehens führen schneller, weil die Aussetzung und die Wiederaufnahme der Funktion von Rahmen oder mehrere Funktionen in anderen Fällen ist langsamer als das erstellen einer Liste auf Nachfrage.Betrachten Sie die folgenden Beispiele :
Können Sie sehen, an offset 22 wir haben ein
append
- Attribut in der ersten Funktion, da wir nicht so etwas in der zweiten Funktion mit list comprehension. Alle diese zusätzlichen bytecodes wird das Anhängen Ansatz langsamer. Beachten Sie auch, dass Sie haben auch dieappend
Attribut laden in jeder iteration das macht den code dauert etwa 2 mal langsamer als die zweite Funktion anhand einer Liste erfassen.Sogar das ausklammern der Zeit, die es nimmt, um zu suchen und laden Sie die
append
Funktion, die Liste Einsicht ist immer noch schneller, denn die Liste ist in C erstellt, anstatt gebaut bis ein Element in einer Zeit, in Python.100000000
Elemente (wenn wir fix den Einzug error) (setup
wird nicht wiederholt für dienumber
loop). Die list comprehension erstellt eine Liste mit10000
Elemente 10000 mal. Sie könnte gemeint habenpython -mtimeit "t=[]" "for i in range(10000): t.append(i)"
vs.python -mtimeit "t=[]" "t_append=t.append" "for i in range(10000): t_append(i)"
vs.python -mtimeit "t=[i for i in range(10000)]"
, Aber es ändert nichts an der Schlussfolgerung (langsam, schneller, schneller).C
zugrunde liegenden gewinnen? Das ist so eine wiederkehrende Aussage, wenn man über Liste Verstehens, die ich aufgenommen haben, es als absolute Wahrheit, ohne tatsächlich die Untersuchung noch tiefer. Jede gute Referenzen dazu?LIST_APPEND
Anleitung zum hinzufügen eines Elements zu der Liste, anstatt eine Funktion aufzurufen.dis.dis("[i for i in range(10000)]")
. WieLIST_APPEND
implementiert ist, kann von der Implementierung abhängig sein, aber es ist verschiedenen aus aufzurufent.append
auf jedes element. (Was könnte das sein, was Sie sind zu beziehen durch "anhalten und fortsetzen einer Funktion frame".)Unter Berufung auf diese Artikel, es ist, weil die
append
Attribut deslist
ist nicht gesucht, geladen und als Funktion aufgerufen, die Zeit und das summiert sich im Laufe der Iterationen.