Contenu du cours
Techniques d'Optimisation en Python
Techniques d'Optimisation en Python
Utilisation du Module Collections
Bien que les types de données intégrés et les tableaux NumPy gèrent la plupart des tâches courantes, le module collections
offre des structures de données spécialisées conçues pour des cas d'utilisation spécifiques. Parmi celles-ci, deque
(file d'attente double) se distingue par ses avantages de performance significatifs dans certains scénarios.
Contrairement aux listes, qui nécessitent de déplacer des éléments lors de l'insertion ou de la suppression depuis le début, un deque
permet des opérations efficaces aux deux extrémités. Par conséquent, si vous avez souvent besoin d'ajouter ou de supprimer des éléments à partir de l'une ou l'autre extrémité d'une collection, un deque
est un meilleur choix.
Maintenant, comparons la performance de list
et deque
dans un scénario pratique :
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()
Dans cet exemple, nous avons créé une list
et une deque
, chacune contenant 1000000 de nombres de 1 à 1000000 inclus. Comme montré, insérer et supprimer des éléments au début est beaucoup plus rapide dans une deque
que dans une list
et reste efficace quelle que soit la taille.
Lorsqu'il s'agit d'insérer ou de supprimer des éléments au début, les deux list
et deque
peuvent gérer ces tâches efficacement. Par conséquent, utiliser une deque
uniquement à cette fin n'offre souvent pas un avantage significatif.
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)
Les résultats de performance sont en effet similaires pour les deux structures de données. Cependant, l'ajout à une list
est légèrement plus lent que l'ajout à un deque
car les listes, implémentées comme des tableaux dynamiques, doivent occasionnellement redimensionner en allouant un bloc de mémoire plus grand et en copiant les éléments. En revanche, la structure en blocs de deque
évite le redimensionnement, rendant les ajouts constamment plus rapides. Cette différence, cependant, devient notable uniquement avec des listes relativement grandes.
Merci pour vos commentaires !