[Python] Fall, in dem sich die Ausführungszeit zwischen der integrierten Liste und der Deque unterscheidet

Listentyp und Deque-Typ

Schauen wir uns das Verhalten der Listen- und Deque-Typen an, bei denen es sich um integrierte Python-Typen handelt.

Unten finden Sie den Code, der eine Liste und Warteschlange mit einer bestimmten Länge erstellt und die Elemente mit abruft. Ausführen mit einer Länge von 10.000, 100.000 und 1 Million in der Reihenfolge.

import time
from collections import deque


for count in [10000, 100000, 1000000]:
    #Objektinitialisierung
    l = ['a'] * count
    q = deque(l)

    #Listentyp Operation
    time1 = time.time()
    while len(l) > 0:
        l.pop(0)

    #Deque-Typ-Betrieb
    time2 = time.time()
    while len(q) > 0:
        q.popleft()
    time3 = time.time()

    print('count:', count)
    print(f'list  finished: {time2 - time1} sec.')
    print(f'deque finished: {time3 - time2} sec.')
    print()

Die Operationen zum Extrahieren des ersten Elements und des letzten Elements sind die folgenden Funktionen für den Listentyp bzw. den Deque-Typ.

from collections import deque

#Initialisieren
l = [1, 2, 3]
q = deque(l)

#Operation zum Abrufen des ersten Elements
l.pop(0)  # => 1
d.popleft()  # => 1

#Operation zum Abrufen des nachfolgenden Elements
l.pop(-1)  # => 3
d.pop()  # => 3

Ausführungsergebnis

Die folgenden Ergebnisse wurden in der vorliegenden Ausführungsumgebung erhalten.

count: 10000
list  finished: 0.006018161773681641 sec.
deque finished: 0.0003972053527832031 sec.

count: 100000
list  finished: 0.9306132793426514 sec.
deque finished: 0.003919839859008789 sec.

count: 1000000
list  finished: 133.8608682155609 sec.
deque finished: 0.04343390464782715 sec.

Bei 1 Million Fällen dauerte der Vorgang vom Listentyp mehr als 2 Minuten.

Warum passiert das?

Zitieren Sie den relevanten Teil aus der offiziellen Dokumentation. Sie können Dinge wie "Anhängen" und "Pop" an Deque-Objekten ausführen, es wird jedoch erwähnt, wie sie sich von denen auf Listenobjekten unterscheiden.

Eine ähnliche Operation kann mit dem Listenobjekt erzielt werden, ist jedoch auf schnelle Operationen mit fester Länge wie pop (0) und insert (0) spezialisiert, die sowohl die Größe als auch die Position des internen Datendarstellungsformats ändern. Operationen wie v) erfordern die Kosten von O (n), um Speicher zu verschieben.

Andererseits benötigt das Deque-Objekt nur die Berechnungskosten von "O (1)".

Zusammenfassung

Listen eignen sich nicht als Datenstruktur, deren Datenlänge sich häufig ändert.

Der Code (list.pop (-1)), der Daten vom letzten Element anstelle des ersten Elements (list.pop (0)) abruft, lautet übrigens wie folgt. In diesem Fall hängt die Verarbeitungszeit von "O (1)" nicht von der Länge der Liste ab, so dass es fast keinen Unterschied in der Ausführungszeit gibt.

import time
from collections import deque


for count in [10000, 100000, 1000000]:
    #Objektinitialisierung
    l = ['a'] * count
    q = deque(l)

    #Listentyp Operation
    time1 = time.time()
    while len(l) > 0:
        l.pop(-1)  # here1

    #Deque-Typ-Betrieb
    time2 = time.time()
    while len(q) > 0:
        q.pop()  # here2
    time3 = time.time()

    print('count:', count)
    print(f'list  finished: {time2 - time1} sec.')
    print(f'deque finished: {time3 - time2} sec.')
    print()

↓ Ausführungsergebnis

count: 10000
list  finished: 0.0006232261657714844 sec.
deque finished: 0.0005576610565185547 sec.

count: 100000
list  finished: 0.005739688873291016 sec.
deque finished: 0.004764080047607422 sec.

count: 1000000
list  finished: 0.05780482292175293 sec.
deque finished: 0.05013251304626465 sec.

Recommended Posts

[Python] Fall, in dem sich die Ausführungszeit zwischen der integrierten Liste und der Deque unterscheidet
Unterschied zwischen Anhängen und + = in der Python-Liste
[Python Iroha] Unterschied zwischen Liste und Tupel
Korrespondenz zwischen den in Python integrierten Funktionen und Rust
[Einführung in Python] Was ist der Unterschied zwischen einer Liste und einem Taple?
Zusammenfassung der Unterschiede zwischen PHP und Python
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
[Python] Konvertierungsnotiz zwischen Zeitdaten und numerischen Daten
Über den Unterschied zwischen "==" und "is" in Python
[Python] Misst und zeigt die für die Verarbeitung erforderliche Zeit an
Funktionsausführungszeit (Python)
Ausführungszeit für Python ausgeben
In Python integrierte Funktion ~ divmod ~ Lassen Sie uns gleichzeitig den Quotienten und den Rest der Division erhalten
[Python] Erstellen Sie eine Datums- und Zeitliste für einen bestimmten Zeitraum
In Python werden die Elemente in der Liste sortiert und als Elemente und Vielfache ausgegeben.
Listenverkettungsmethode in Python, Unterschied zwischen list.extend () und dem Operator "+"
[Python] Zeigt die verstrichene Zeit in Stunden, Minuten und Sekunden an (00:00:00)
Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit in Python unter Berücksichtigung des Zeitunterschieds
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
python Hinweis: enumerate () - Index und Element der Liste gleichzeitig abrufen und zur Anweisung wenden
Memo zur Messung der Python-Ausführungszeit
Messung der Ausführungszeit mit Python With
Python-Liste und Tapples und Kommas
Python-Listeneinschlussnotation und Generator
Bestimmen Sie das Datums- und Uhrzeitformat mit Python und konvertieren Sie es in Unixtime
Ich möchte die Ausführungszeit aufzeichnen und ein Protokoll führen.
Python: Aktualisieren Sie pyenv ohne nachzudenken und lösen Sie das Phänomen "Wo ist Python?"
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Python> Extrahieren Sie den Wert von list (entpacken)> Hinzufügen *> Sie haben mir den Unterschied zwischen Python 2 und Python 3 in Bezug auf print (* mylist) / print () beigebracht.