Het Gebruik van de Collections-Module
Hoewel ingebouwde datatypen en NumPy-arrays de meeste standaardtaken afhandelen, biedt de collections-module gespecialiseerde datastructuren die zijn ontworpen voor specifieke toepassingen. Onder deze structuren valt deque (dubbelzijdige wachtrij) op door aanzienlijke prestatievoordelen in bepaalde scenario's.
In tegenstelling tot lijsten, waarbij elementen verschoven moeten worden bij het invoegen of verwijderen aan het begin, maakt een deque efficiënte bewerkingen aan beide uiteinden mogelijk. Wanneer het dus vaak nodig is om elementen aan het begin of einde van een collectie toe te voegen of te verwijderen, is een deque een betere keuze.
Nu volgt een vergelijking van de prestaties van list en deque in een praktische situatie:
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 dit voorbeeld hebben we een list en een deque aangemaakt, elk met 1.000.000 getallen van 1 tot en met 1.000.000. Zoals getoond is het invoegen en verwijderen van elementen aan het begin veel sneller in een deque dan in een list en blijft efficiënt ongeacht de grootte.
Voor het invoegen of verwijderen van elementen aan het begin kunnen zowel list als deque deze taken efficiënt uitvoeren. Daarom biedt het gebruik van een deque uitsluitend voor dit doel vaak geen significant voordeel.
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)
De prestatieverschillen zijn inderdaad vergelijkbaar voor beide datastructuren. Echter, het toevoegen aan een list is iets trager dan het toevoegen aan een deque, omdat lijsten, geïmplementeerd als dynamische arrays, af en toe moeten resizen door een groter geheugenblok toe te wijzen en elementen te kopiëren. Daarentegen voorkomt de blokgebaseerde structuur van deque het resizen, waardoor toevoegingen consequent sneller verlopen. Dit verschil wordt echter pas merkbaar bij relatief grote lijsten.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
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
Het Gebruik van de Collections-Module
Veeg om het menu te tonen
Hoewel ingebouwde datatypen en NumPy-arrays de meeste standaardtaken afhandelen, biedt de collections-module gespecialiseerde datastructuren die zijn ontworpen voor specifieke toepassingen. Onder deze structuren valt deque (dubbelzijdige wachtrij) op door aanzienlijke prestatievoordelen in bepaalde scenario's.
In tegenstelling tot lijsten, waarbij elementen verschoven moeten worden bij het invoegen of verwijderen aan het begin, maakt een deque efficiënte bewerkingen aan beide uiteinden mogelijk. Wanneer het dus vaak nodig is om elementen aan het begin of einde van een collectie toe te voegen of te verwijderen, is een deque een betere keuze.
Nu volgt een vergelijking van de prestaties van list en deque in een praktische situatie:
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 dit voorbeeld hebben we een list en een deque aangemaakt, elk met 1.000.000 getallen van 1 tot en met 1.000.000. Zoals getoond is het invoegen en verwijderen van elementen aan het begin veel sneller in een deque dan in een list en blijft efficiënt ongeacht de grootte.
Voor het invoegen of verwijderen van elementen aan het begin kunnen zowel list als deque deze taken efficiënt uitvoeren. Daarom biedt het gebruik van een deque uitsluitend voor dit doel vaak geen significant voordeel.
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)
De prestatieverschillen zijn inderdaad vergelijkbaar voor beide datastructuren. Echter, het toevoegen aan een list is iets trager dan het toevoegen aan een deque, omdat lijsten, geïmplementeerd als dynamische arrays, af en toe moeten resizen door een groter geheugenblok toe te wijzen en elementen te kopiëren. Daarentegen voorkomt de blokgebaseerde structuur van deque het resizen, waardoor toevoegingen consequent sneller verlopen. Dit verschil wordt echter pas merkbaar bij relatief grote lijsten.
Bedankt voor je feedback!