Maison  >  Article  >  développement back-end  >  Pourquoi la compréhension d'une liste est-elle beaucoup plus rapide que l'ajout à une liste en Python ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 03:47:02259parcourir

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)

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)

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)

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!

Déclaration:
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