Pourquoi la compréhension d'une liste est-elle beaucoup plus rapide que l'ajout à une liste en Python ?

Patricia Arquette
Libérer: 2024-10-28 03:47:02
original
359 Les gens l'ont consulté

Why is List Comprehension Significantly Faster Than Appending to a List in Python?

Pourquoi l'ajout à une liste est-il significativement plus lent que la compréhension de liste ?

La compréhension de liste a gagné en popularité en Python en raison de sa brièveté et de son efficacité. Bien qu'il puisse apparaître comme un raccourci syntaxique pour une boucle for classique, il offre des avantages significatifs en termes de performances, en particulier lors de l'ajout d'éléments à une liste.

Analyser la différence

Considérez l'extrait de code suivant :

import timeit

timeit.timeit(stmt='''
t = []
for i in range(10000):
    t.append(i)''', number=10000)

timeit.timeit(stmt='t= [i for i in range(10000)]', number=10000)
Copier après la connexion

Comme le montrent les résultats, la compréhension des listes est nettement plus rapide, surpassant d'environ 50 % l'approche par ajout.

Explorer les raisons

La compréhension de liste est essentiellement une construction syntaxique qui génère une nouvelle liste basée sur un itérable existant. Contrairement à la méthode d'ajout, elle ne nécessite pas la récupération et l'invocation de l'attribut append à chaque itération.

Désassemblage du code

Une analyse plus approfondie à l'aide du désassembleur fournit des informations dans les différences sous-jacentes :

# Function using appending
dis.dis(f1)
Copier après la connexion

Dans le code démonté de la fonction utilisant l'ajout, il y a une paire LOAD_METHOD et CALL_METHOD notable pour chaque itération (bytecodes 18-22). Ces instructions gèrent le chargement et l'invocation de l'attribut append, ce qui entraîne une surcharge.

# Function using list comprehension
dis.dis(f2)
Copier après la connexion

En revanche, la version de compréhension de liste (bytecodes 10-12) implique une seule instruction CALL_FUNCTION. Cette instruction construit efficacement une nouvelle liste sans avoir besoin de récupération d'attributs.

Conclusion

L'efficacité améliorée de la compréhension de liste découle de sa mise en œuvre optimisée. En évitant le chargement et l'invocation répétés de l'attribut append, la compréhension de liste crée des listes à la demande, ce qui entraîne des gains de performances significatifs, en particulier lorsque vous travaillez avec de grandes itérations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal