Les générateurs Python sont un outil puissant pour améliorer l'efficacité de la mémoire, en particulier lorsqu'ils traitent de grands ensembles de données. Ils y parviennent en produisant des valeurs une à la fois, à la demande, au lieu de créer l'ensemble de données en mémoire à la fois. Cela se fait à l'aide du mot-clé rendement
au lieu de return
dans une fonction. Une fonction de générateur ne renvoie pas directement une valeur; Au lieu de cela, il renvoie un objet générateur. Cet objet peut ensuite être itéré, produisant chaque valeur au besoin.
Illustrons avec un exemple. Supposons que vous souhaitiez générer une séquence de nombres de 1 à 10 000 000. Une approche basée sur la liste consommerait une mémoire significative:
<code class="python"> my_list = list (range (10000000)) # consomme beaucoup plus de mémoire </code> <p> my_generator () # crée un objet générateur; Aucune mémoire consommée pour encore pour NUM dans MY_GEN: # traitez chaque numéro individuellement. Un seul numéro est en mémoire à la fois. Imprimer (num) #Ce imprimera les numéros un par un. Vous pouvez le remplacer par votre logique de traitement. </p>
La différence de clé réside dans le moment où les valeurs sont générées. L'approche de la liste crée les 10 millions de chiffres immédiatement. L'approche du générateur ne crée chaque numéro que lorsqu'il est demandé lors de l'itération. Cette évaluation paresseuse est au cœur de l'efficacité de la mémoire d'un générateur. Vous pouvez également utiliser des expressions de générateur pour la création concise du générateur:
<code class="python"> my_gen_expression = (i for i in range (10000000)) #simimar to ci-dessus, mais plus concise pour num dans MY_GEN_EXPRESSION: imprimer (num) </code>
Le principal avantage des générateurs par rapport aux listes pour les grands ensembles de données est Efficacité de la mémoire . Les listes stockent tous leurs éléments en mémoire simultanément, conduisant à une consommation de mémoire élevée pour les grands ensembles de données qui pourraient dépasser la RAM disponible. Les générateurs, en revanche, génèrent des valeurs à la demande, en gardant une utilisation de la mémoire minimale. Cela empêche des exceptions MemoryError
et permet le traitement des ensembles de données beaucoup plus grands que la RAM disponible.
Au-delà de l'efficacité de la mémoire, les générateurs offrent également:
Tire les générateurs pour améliorer les performances dans les tâches à forte intensité de mémoire implique des compréhensions de liste de listes ou des listes de zones de génération en mémoire dans des fonctions de générateur de générateurs. Cela réduit l'empreinte de la mémoire et peut considérablement accélérer le traitement, en particulier pour les tâches liées aux E / S F: Lines = F.Readlines () # lit Fichier entier dans la mémoire processEd_lines = [line.strip (). Upper () pour la ligne en lignes] # traite la liste entière en mémoire
Efficient (en utilisant les générateurs):
<code class="pyton"> process_file (filename): avec ouverte (python "> process_file (filename): with open (fireneName, & quot; root; Comme f: pour la ligne dans f: rente line.strip (). Upper () pour proced_line dans process_file (& quot; Large_file.txt & quot;): # Process chaque ligne Imprime individuellement (processEd_line) </code>
La version générateur traite chaque ligne individuellement au fur et à mesure qu'elle est lue à partir du fichier, en évitant le fichier entier dans la mémoire. Ceci est crucial pour les fichiers beaucoup plus grands que la RAM disponible. De même, vous pouvez appliquer ce principe à d'autres opérations à forte intensité de mémoire comme les requêtes de base de données ou les demandes de réseau où vous traitez les résultats itérativement plutôt que de tout charger. ensembles de données: Lorsque la taille des données dépasse les RAM disponibles, les générateurs sont essentiels pour éviter MemoryError Exceptions. <li> <strong> Traitement des flux de données: </strong> Lorsque vous travaillez avec des flux de données continus (par exemple, les données réseau, les lectures de sensor), les générateurs fournissent un moyen efficace de traiter les données à leur arrivée sans tamponner le flux entier. Calculs: Lorsque vous effectuez des calculs sur une séquence où le résultat d'une étape dépend de la précédente, les générateurs peuvent être utilisés pour éviter de stocker les résultats intermédiaires dans la mémoire. </li> <li> <strong> Amélioration de la lisibilité du code: </strong> Pour les transformations de données complexes, les générateurs peuvent simplifier le code en décomposant le processus en étapes plus petites et gérables, conduisant à une amélioration de la maintenabilité. Séquences: Les générateurs sont le seul moyen pratique de représenter et de travailler avec des séquences infinies dans Python. </li> <p> Essentiellement, chaque fois que vous travaillez avec des données qui pourraient ne pas s'adapter confortablement en mémoire, ou lorsque l'évaluation paresseuse peut améliorer les performances, les générateurs Python devraient être une considération forte. Ils fournissent un moyen puissant et efficace de gérer de grands ensembles de données et des données de streaming, améliorant considérablement les performances et l'évolutivité de vos applications. </p>
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!