En Python, les compréhensions de listes offrent une syntaxe concise pour générer des listes. Cependant, leur utilisation rigide des crochets peut parfois être restrictive. Curieusement, l'extrait de code ci-dessous démontre l'omission déroutante des crochets :
''.join(str(_) for _ in xrange(10))
Ce code joint correctement les chaînes de 0 à 9, malgré l'absence de crochets. Ce phénomène découle de l'introduction des expressions génératrices.
Les expressions génératrices sont similaires aux compréhensions de listes, mais elles génèrent des données de manière incrémentielle, plutôt que de créer une liste complète dans mémoire. Cela peut présenter des avantages significatifs en termes de performances pour les grands ensembles de données.
Dans l'exemple donné, l'expression str(_) for _ in xrange(10) est une expression génératrice qui génère un flux de chaînes de 0 à 9. Tandis que cette expression ressemble à une compréhension de liste, elle est fondamentalement différente :
While générateur d'expressions sont souvent plus efficaces que les compréhensions de listes, ce n'est pas toujours le cas lors de l'utilisation de la fonction join().
~ $ python -m timeit '"".join(str(n) for n in xrange(1000))' 1000 loops, best of 3: 335 usec per loop ~ $ python -m timeit '"".join([str(n) for n in xrange(1000)])' 1000 loops, best of 3: 288 usec per loop
Dans ce scénario, fournir une vraie liste à rejoindre() est plus rapide et plus économe en mémoire car elle n'a besoin de parcourir les données qu'une seule fois.
Comprendre la différence entre les expressions génératrices et les compréhensions de liste est crucial pour optimisation du code Python. Bien que les expressions génératrices offrent une efficacité et une vitesse de mémoire améliorées dans certaines situations, elles ne constituent pas toujours le meilleur choix pour des fonctions telles que join() où la création d'une véritable liste est bénéfique.
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!