insertion de python vs append
J'ai écrit de base de python extraits de code à insérer des valeurs dans une liste, puis de l'inverser. Je trouve qu'il y a une énorme différence de vitesse d'exécution entre l'insert et l'ajout des méthodes.
Extrait 1:
L = []
for i in range(10**5):
L.append(i)
L.reverse()
Temps d'exécution de cette :
real 0m0.070s
user 0m0.064s
sys 0m0.008s
Extrait 2:
l = []
for i in range(10**5):
l.insert(0,i)
Temps d'exécution:
real 0m5.645s
user 0m5.516s
sys 0m0.020s
Je m'attendais à de l'extrait 2 pour effectuer beaucoup mieux que snippet1, puisque je suis en effectuant l'opération inverse directement par l'insertion, les numéros avant de. Mais le temps passé dit le contraire. Je n'arrive pas à comprendre pourquoi cette dernière méthode prend plus de temps à s'exécuter, même si la méthode semble plus élégant. Ce que quelqu'un a une explication à cela?
source d'informationauteur Rahul | 2011-10-15
Vous devez vous connecter pour publier un commentaire.
Noter que vos résultats dépendent de la précision Python de mise en œuvre. disponible (et pypy) redimensionner automatiquement votre liste et surdimensionner de l'espace pour de futures ajoute et donc d'accélérer la
append
en outre.En interne, les listes sont des morceaux de mémoire avec une taille constante (sur la tas). Parfois, vous avez de la chance et peut augmenter la taille de la partie, mais dans de nombreux cas, un objet sera déjà là. Par exemple, supposons que vous avez alloué un morceau de la taille 4 pour une liste
[a,b,c,d]
et quelque autre morceau de code attribué un morceau de taille 6 pour un dictionnaire:Supposons que votre liste a les 4 éléments, et un autre est ajouté. Maintenant, vous pouvez simplement redimensionner la liste taille 5:
Cependant, que faites-vous si vous avez besoin d'un autre élément maintenant?
Bien, la seule chose que vous pouvez faire est d'acquérir un nouvel espace et de copier le contenu de la liste.
Noter que si vous achetez de l'espace en vrac (c'est le cas surdimensionnement de), vous aurez seulement besoin de redimensionner (et, éventuellement, la copie) de la liste chaque maintenant et puis.
En revanche, lorsque vous insérez à la position 0, on a toujours besoin de la copie de votre liste. Nous allons insérer
x
:Bien qu'il y ait assez d'espace pour ajouter x à la fin, nous avons dû nous déplacer (même pas de la copie, ce qui peut être moins coûteux en mémoire) toutes les autres valeurs.
Voici la réponse de Duncan Stand:
En fait, j'ai rien d'autre à ajouter.
Si vous avez besoin d'un discbased qui est aussi efficace en insérant au début, car elle est en ajoutant, alors vous devriez envisager un deque.
J'ai appris un truc pour insérer le x dans le début d'une liste Python de Poche":
Il doit être d'une certaine façon très similaire à l'.insert(0, x), mais quand j'essaie de comparer trois options: append(x), insert(0, x) et l[:0] = [x], la dernière option effectue un peu plus rapide que la seconde.
Voici le code de test et le résultat
temps moyen
Pourquoi il est environ 25% plus rapide que l'insert(0, x)? J'ai essayé d'intervertir le bloc de code de l'estimation de t1, t2, t3, mais le résultat est le même, donc il n'est pas sur la mise en cache de la liste.
Iciil indique que le réglage de tranche prend O(k + n)
Méthode d'insertion de manière appropriée de mettre en place dans la File d'attente .
FIFO opération, s'insère sur la face de la liste.
ex :. éléments.insert(0 point)
Méthode Append de façon appropriée la mise en œuvre de la pile .
Ce PRINCIPE de fonctionnement, insère à la fin de la liste.
ex :. éléments.append(élément)
Lorsque nous sommes à l'aide de l'insertion de données thru méthode INSERT assurez-vous que tous les index sont re-séquencé.