Heim  >  Artikel  >  Backend-Entwicklung  >  Warum sind Listenverständnisse in Python schneller als das Anhängen von Listen?

Warum sind Listenverständnisse in Python schneller als das Anhängen von Listen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-28 16:58:29212Durchsuche

Why Are List Comprehensions Faster Than List Appending in Python?

Warum Listenverständnisse besser abschneiden als das Anhängen von Listen

Obwohl Listenverständnisse lediglich als Ausdruckszucker wahrgenommen werden, weisen sie einen erheblichen Geschwindigkeitsvorteil gegenüber dem Anhängen von Listen auf . Diese Ungleichheit geht über die Ausdrucksunterschiede hinaus.

Betrachten Sie zur Veranschaulichung die folgenden Timeit-Benchmarks:

<code class="python">import timeit

time = timeit.timeit('t=[]\nfor i in range(10000):\n    t.append(i)', number=10000)
time2 = timeit.timeit('t=[i for i in range(10000)]', number=10000)</code>

Die Ergebnisse zeigen, dass Listenverständnisse etwa 50 % schneller ausgeführt werden als das Anhängen an eine Liste.

Gründe für erhöhte Geschwindigkeit

Listenverständnisse nutzen mehrere Leistungsoptimierungen:

  • Eliminierung des Attributladens und von Funktionsaufrufen: Beim Anhängen von Listen erfordert jede Iteration das Laden des Append-Attributs der Liste und den Aufruf als Funktion. Listenverständnisse eliminieren diesen Overhead, indem bei Bedarf eine neue Liste erstellt wird.
  • Unterbrechung und Wiederaufnahme im Vergleich zur sofortigen Listenerstellung: Das Anhalten und Fortsetzen des Frames einer Funktion ist im Allgemeinen langsamer als das direkte Erstellen einer Liste bei Bedarf .

Beispiele

Beachten Sie die folgenden Codeausschnitte:

<code class="python">def f1():
    l = []                                    # Create a new list
    for i in range(5):                      # Iterate through a range
        l.append(i)                         # Append each number to the list

def f2():
    [i for i in range(5)]                  # Use list comprehension to create a new list</code>

Das Zerlegen dieser Funktionen mit dem dis-Modul zeigt die Unterschiede:

<code class="python">dis.dis(f1)
dis.dis(f2)</code>

In f1 beobachten wir die Erstellung einer Liste sowie das Laden und Aufrufen des Append-Attributs (Offsets 18 und 20). In f2 fehlen diese Operationen jedoch, was zu einem effizienteren Code führt.

Fazit

Listenverständnisse erzielen eine verbesserte Leistung, indem sie das Laden von Attributen, Funktionsaufrufe usw. eliminieren der mit der Unterbrechung und Wiederaufnahme von Funktionsrahmen verbundene Mehraufwand. Daher werden sie oft für die Erstellung neuer Listen empfohlen, bei denen es auf Geschwindigkeit ankommt.

Das obige ist der detaillierte Inhalt vonWarum sind Listenverständnisse in Python schneller als das Anhängen von Listen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn