list.append()
est le choix évident pour ajouter à la fin d'une liste. Voici une explication raisonnable pour les disparus list.prepend()
. En supposant que ma liste est courte et que les problèmes de performances sont négligeables,
list.insert(0, x)
ou
list[0:0] = [x]
idiomatique?
Si vous pouvez suivre la voie fonctionnelle, ce qui suit est assez clair
Bien sûr, vous ne l'avez pas inséré
x
dansyour_list
, plutôt vous avez créé une nouvelle liste avecx
pré-ajouté.la source
Vous ne voulez généralement pas ajouter de manière répétitive à une liste en Python.
Si c'est court et que tu ne le fais pas beaucoup ... alors ok.
list.insert
Le
list.insert
peut être utilisé de cette façon.Mais cela est inefficace, car en Python, un
list
est un tableau de pointeurs, et Python doit maintenant prendre chaque pointeur de la liste et le déplacer vers le bas d'un pour insérer le pointeur sur votre objet dans le premier emplacement, donc ce n'est vraiment efficace pour des listes assez courtes, comme vous le demandez.Voici un extrait de la source CPython où cela est implémenté - et comme vous pouvez le voir, nous commençons à la fin du tableau et déplaçons tout par le bas pour chaque insertion:
Si vous voulez un conteneur / une liste efficace pour ajouter des éléments, vous voulez une liste liée. Python a une liste doublement liée, qui peut être insérée au début et à la fin rapidement - elle s'appelle a
deque
.deque.appendleft
A
collections.deque
possède de nombreuses méthodes d'une liste.list.sort
est une exception, ce qui renddeque
définitivement pas entièrement Liskov substituable àlist
.Le a
deque
également uneappendleft
méthode (ainsi quepopleft
). Ildeque
s'agit d'une file d'attente à double extrémité et d'une liste à double liaison - quelle que soit la longueur, il faut toujours autant de temps pour préparer quelque chose. En grande notation O, O (1) par rapport au temps O (n) pour les listes. Voici l'utilisation:deque.extendleft
La
extendleft
méthode deque , qui préfère itérativement:Notez que chaque élément sera ajouté un à la fois, inversant ainsi efficacement leur ordre.
Performance de
list
versusdeque
D'abord, nous configurons avec un préfixe itératif:
et performance:
Le deque est beaucoup plus rapide. À mesure que les listes s'allongent, je m'attendrais à ce qu'un deque fonctionne encore mieux. Si vous pouvez utiliser deque,
extendleft
vous obtiendrez probablement les meilleures performances de cette façon.la source
Si quelqu'un trouve cette question comme moi, voici mes tests de performance des méthodes proposées:
Comme vous pouvez le voir, l'
insert
attribution des tranches est presque deux fois plus rapide que l'ajout explicite et les résultats sont très proches. Comme l'a noté Raymond Hettinger,insert
c'est une option plus courante et moi, personnellement, je préfère cette façon de préparer à la liste.la source
.insert
et le[0:0] = [0]
travail en place , ils ont encore de réattribuer l'ensemble de la mémoire tampon.