Verwendung des Collections-Moduls
Obwohl eingebaute Datentypen und NumPy-Arrays die meisten gängigen Aufgaben abdecken, bietet das Modul collections spezialisierte Datenstrukturen für bestimmte Anwendungsfälle. Unter diesen zeichnet sich deque (doppelt verkettete Warteschlange) durch erhebliche Leistungsvorteile in bestimmten Szenarien aus.
Im Gegensatz zu Listen, bei denen beim Einfügen oder Entfernen am Anfang Elemente verschoben werden müssen, ermöglicht ein deque effiziente Operationen an beiden Enden. Wenn also häufig Elemente an einem der beiden Enden einer Sammlung hinzugefügt oder entfernt werden müssen, ist ein deque die bessere Wahl.
Im Folgenden wird die Leistung von list und deque in einem praktischen Szenario verglichen:
123456789101112131415161718192021222324252627282930import os os.system('wget https://staging-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 wurden eine list und ein deque erstellt, die jeweils 1.000.000 Zahlen von 1 bis einschließlich 1.000.000 enthalten. Wie gezeigt, ist das Einfügen und Entfernen von Elementen am Anfang bei einem deque deutlich schneller als bei einer list und bleibt unabhängig von der Größe effizient.
Bezüglich des Einfügens oder Entfernens von Elementen am Anfang können sowohl list als auch deque diese Aufgaben effizient ausführen. Daher bietet die Verwendung eines deque ausschließlich zu diesem Zweck häufig keinen signifikanten Vorteil.
1234567891011121314151617181920212223import os os.system('wget https://staging-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 Leistungswerte 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 vergrößert werden müssen, indem ein größerer Speicherblock zugewiesen und die Elemente kopiert werden. Im Gegensatz dazu vermeidet die blockbasierte Struktur von deque das Vergrößern, wodurch das Anhängen durchgehend schneller erfolgt. Dieser Unterschied wird jedoch erst bei relativ großen Listen deutlich.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
What are some real-world use cases for deque?
Can you explain more about how deque is implemented internally?
When should I use a list instead of a deque?
Awesome!
Completion rate improved to 7.69
Verwendung des Collections-Moduls
Swipe um das Menü anzuzeigen
Obwohl eingebaute Datentypen und NumPy-Arrays die meisten gängigen Aufgaben abdecken, bietet das Modul collections spezialisierte Datenstrukturen für bestimmte Anwendungsfälle. Unter diesen zeichnet sich deque (doppelt verkettete Warteschlange) durch erhebliche Leistungsvorteile in bestimmten Szenarien aus.
Im Gegensatz zu Listen, bei denen beim Einfügen oder Entfernen am Anfang Elemente verschoben werden müssen, ermöglicht ein deque effiziente Operationen an beiden Enden. Wenn also häufig Elemente an einem der beiden Enden einer Sammlung hinzugefügt oder entfernt werden müssen, ist ein deque die bessere Wahl.
Im Folgenden wird die Leistung von list und deque in einem praktischen Szenario verglichen:
123456789101112131415161718192021222324252627282930import os os.system('wget https://staging-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 wurden eine list und ein deque erstellt, die jeweils 1.000.000 Zahlen von 1 bis einschließlich 1.000.000 enthalten. Wie gezeigt, ist das Einfügen und Entfernen von Elementen am Anfang bei einem deque deutlich schneller als bei einer list und bleibt unabhängig von der Größe effizient.
Bezüglich des Einfügens oder Entfernens von Elementen am Anfang können sowohl list als auch deque diese Aufgaben effizient ausführen. Daher bietet die Verwendung eines deque ausschließlich zu diesem Zweck häufig keinen signifikanten Vorteil.
1234567891011121314151617181920212223import os os.system('wget https://staging-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 Leistungswerte 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 vergrößert werden müssen, indem ein größerer Speicherblock zugewiesen und die Elemente kopiert werden. Im Gegensatz dazu vermeidet die blockbasierte Struktur von deque das Vergrößern, wodurch das Anhängen durchgehend schneller erfolgt. Dieser Unterschied wird jedoch erst bei relativ großen Listen deutlich.
Danke für Ihr Feedback!