Kursinhalt
Optimierungstechniken in Python
Optimierungstechniken in Python
Verwendung des Collections-Moduls
Obwohl eingebaute Datentypen und NumPy-Arrays die meisten gängigen Aufgaben bewältigen, bietet das collections
-Modul spezialisierte Datenstrukturen, die für spezifische Anwendungsfälle entwickelt wurden. Unter diesen sticht deque
(doppelt verkettete Warteschlange) aufgrund seiner erheblichen Leistungsverbesserungen in bestimmten Szenarien hervor.
Im Gegensatz zu Listen, die Elementverschiebungen erfordern, wenn Elemente am Anfang eingefügt oder entfernt werden, ermöglicht ein deque
effiziente Operationen an beiden Enden. Daher ist ein deque
die bessere Wahl, wenn Sie häufig Elemente an einem der Enden einer Sammlung hinzufügen oder entfernen müssen.
Nun, lassen Sie uns die Leistung von list
und deque
in einem praktischen Szenario vergleichen:
import os os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator from collections import deque numbers_list = list(range(1, 10000001)) numbers_deque = deque(numbers_list) @timeit_decorator(number=1000) def list_append_left(): # Insert -1 at the beginning numbers_list.insert(0, -1) @timeit_decorator(number=1000) def deque_append_left(): numbers_deque.appendleft(-1) @timeit_decorator(number=1000) def list_pop_left(): # Remove the element at index 0 (first element) numbers_list.pop(0) @timeit_decorator(number=1000) def deque_pop_left(): numbers_deque.popleft() list_append_left() deque_append_left() list_pop_left() deque_pop_left()
In diesem Beispiel haben wir eine list
und eine deque
erstellt, die jeweils 1000000 Zahlen von 1 bis 1000000 enthalten. Wie gezeigt, ist das Einfügen und Entfernen von Elementen am Anfang in einer deque
viel schneller als in einer list
und bleibt unabhängig von der Größe effizient.
Wenn es darum geht, Elemente am Anfang einzufügen oder zu entfernen, können sowohl list
als auch deque
diese Aufgaben effizient bewältigen. Daher bietet die Verwendung einer deque
ausschließlich zu diesem Zweck oft keinen signifikanten Vorteil.
import os os.system('wget https://content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator from collections import deque numbers_list = list(range(1, 10000001)) numbers_deque = deque(numbers_list) @timeit_decorator(number=1000) def append_right(data_structure): data_structure.append(-1) @timeit_decorator(number=1000) def pop_right(data_structure): data_structure.pop() print('List performance:') append_right(numbers_list) pop_right(numbers_list) print('Dequeue performance:') append_right(numbers_deque) pop_right(numbers_deque)
Die Leistungsresultate sind tatsächlich für beide Datenstrukturen ähnlich. Das Anhängen an eine list
ist jedoch etwas langsamer als das Anhängen an eine deque
, da Listen, die als dynamische Arrays implementiert sind, gelegentlich durch Zuweisung eines größeren Speicherblocks und Kopieren von Elementen vergrößert werden müssen. Im Gegensatz dazu vermeidet die blockbasierte Struktur von deque
das Vergrößern, was das Anhängen durchgehend schneller macht. Dieser Unterschied wird jedoch nur bei relativ großen Listen bemerkbar.
Danke für Ihr Feedback!