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!