Histoire de la question
Les listes (list) sont l'un des types de données intégrés de base en Python depuis les premières versions du langage. Avec le temps, leur structure interne a été améliorée, notamment pour augmenter les performances et la commodité de programmation.
Problème
Il est important de comprendre que les listes en Python ne sont pas implémentées comme des listes chaînées, mais comme des tableaux dynamiques. Une représentation erronée peut conduire à un code inefficace ou à un calcul incorrect de la complexité des opérations.
Solution
Les listes sont implémentées comme des tableaux dynamiques qui augmentent la taille de la mémoire allouée "par bond" (en s'étendant) pour éviter des coûts constants lors de l'ajout d'éléments. Cela permet d'insérer et de supprimer des éléments à la fin de la liste en temps amorti O(1). L'insertion ou la suppression au milieu/au début nécessite de déplacer des éléments, ce qui prend O(n) de temps.
Exemple de code :
ma_liste = [1, 2, 3] ma_liste.append(4) # Ajout à la fin ma_liste.insert(1, 'a') # Insertion à l'index print(ma_liste)
Caractéristiques clés :
Peut-on considérer la liste en Python comme un tableau en C ? Quelle est la différence ?
Non, un tableau en C contient des éléments de type fixe, placés consécutivement en mémoire. La liste Python est un tableau de pointeurs vers des objets, chacun référant à un objet autonome de type arbitraire dans le tas.
Que se passe-t-il si l'on insère des éléments au début de la liste dans une boucle ? Est-ce rapide ?
Non, c'est lent : lors de l'insertion au début (position 0), tous les éléments existants sont décalés vers la droite à chaque fois. La complexité amortie est de O(n) par opération, ce qui entraîne une dégradation des performances pour de grandes listes.
Quelle est la différence entre les opérateurs + et append/extend pour les listes ?
lst1 = [1, 2] lst2 = [3, 4] lst3 = lst1 + lst2 # lst3 est une nouvelle liste lst1.append(lst2) # lst1 devient [1, 2, [3, 4]] lst1.extend(lst2) # lst1 devient [1, 2, 3, 4], si lst1 n'est pas réinitialisé après le précédent append
Dans un projet, une liste était utilisée pour stocker et supprimer constamment les premiers éléments. Un ralentissement notable a été observé avec un grand volume de données.
Avantages :
Inconvénients :
Après avoir identifié le problème, nous avons remplacé la liste par collections.deque, qui est optimisée pour de telles opérations.
Avantages :
Inconvénients :