Maison > développement back-end > Tutoriel Python > Comment utiliser des générateurs Python pour l'efficacité de la mémoire?

Comment utiliser des générateurs Python pour l'efficacité de la mémoire?

Johnathan Smith
Libérer: 2025-03-10 18:42:43
original
683 Les gens l'ont consulté

Comment utiliser les générateurs Python pour l'efficacité de la mémoire?

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>
Copier après la connexion

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> 
Copier après la connexion

ensembles de données?

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:

  • Performances améliorées: parce que les générateurs n'ont pas besoin de générer toutes les valeurs initiales, ils peuvent souvent être plus loin, d'autant plus que lorsque seule une partie est nécessaire. Le temps passé à créer des éléments inutiles est enregistré.
  • CLARITÉ DE CODE: Pour les transformations de données complexes, les générateurs peuvent conduire à un code plus lisible et maintenable en décomposant le processus en étapes plus petites et gérables.
  • Séquences infinies: Les générateurs peuvent facilement représenter des séquences infinies, ce qui est impossible avec des listes. Par exemple, un générateur peut produire des nombres premiers indéfiniment.

Comment puis-je améliorer les performances de mon code Python en tirant parti des générateurs pour gérer les tâches à forte intensité de la mémoire?

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> 
Copier après la connexion

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!

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