Générateurs Python : itérateurs économes en mémoire

Apprenez à utiliser les générateurs Python et les instructions rendement pour traiter d'énormes ensembles de données avec une empreinte mémoire minimale. Expressions du générateur principal.

Essayez dans l'éditeur

Aperçu

Lors de l’écriture de code traitant des milliers ou des millions d’enregistrements, la gestion de la mémoire devient critique. Si vous chargez un ensemble de données complet dans une liste, vous risquez de manquer de RAM et de faire planter le serveur. Les générateurs Python résolvent ce problème en fournissant un mécanisme permettant de diffuser des données à la demande. Au lieu de calculer et de stocker l'intégralité de l'ensemble de données en mémoire en même temps, un générateur produit un élément à la fois, le transmet à l'appelant et suspend son exécution jusqu'à ce que l'élément suivant soit demandé.

Les générateurs sont définis comme des fonctions normales, mais ils utilisent le mot-clé `yield` au lieu de `return`. Lorsqu'une fonction génératrice est appelée, elle renvoie un objet itérateur générateur sans exécuter les instructions internes de la fonction. Lorsque l'appelant appelle « next() » sur le générateur (ou boucle dessus), la fonction s'exécute jusqu'à ce qu'elle atteigne « yield ». À ce stade, le générateur renvoie la valeur, enregistre ses variables locales et suspend l'exécution. Lorsqu'il est rappelé, il reprend exactement là où il s'était arrêté.

Vous pouvez également créer des générateurs à l'aide d'expressions génératrices, qui utilisent une syntaxe identique aux compréhensions de liste mais entourées de parenthèses `(...)` au lieu de crochets `[...]`. Cela rend incroyablement facile le remplacement des compréhensions de liste par des itérateurs économes en mémoire. En évitant les allocations massives de mémoire, les générateurs sont indispensables pour travailler avec des journaux volumineux, diffuser des données à partir de bases de données ou effectuer des calculs sur des séquences mathématiques de longueur infinie.

Sortie de code et d'exécution

Un générateur personnalisé produisant des nombres de Fibonacci et une expression génératrice économe en mémoire.

generators_demo.py
Essayez dans l'éditeur
def fibonacci_generator(limit):
    """Yields Fibonacci numbers up to the limit."""
    a, b = 0, 1
    count = 0
    while count < limit:
        yield a
        a, b = b, a + b
        count += 1

# Instantiate generator
fib = fibonacci_generator(5)
print("--- Using Generator Function ---")
for num in fib:
    print(num)

# Generator expression (squares of numbers)
squares_gen = (x**2 for x in range(1, 1000000))
print("\n--- Using Generator Expression ---")
print(next(squares_gen))
print(next(squares_gen))
print(next(squares_gen))
Sortie terminale
--- Using Generator Function ---
0
1
1
2
3

--- Using Generator Expression ---
1
4
9

Mise en œuvre étape par étape

  • Lecture ligne par ligne de fichiers trop volumineux pour la RAM
  • Générer une séquence infinie d'identifiants ou de chiffres mathématiques
  • Streaming des enregistrements de base de données par lots pour traiter les appels d'API

Foire aux questions

Quelle est la différence entre rendement et rendement ?

return termine complètement la fonction. rendement renvoie une valeur et met la fonction en pause, enregistrant son état afin qu'elle puisse reprendre à la demande.

Que se passe-t-il lorsqu'un générateur manque d'articles ?

Cela déclenche une exception StopIteration. Sous une boucle 'for', Python intercepte automatiquement cette exception pour terminer proprement la boucle.

Sujets connexes

Ressources Python recommandées

Développez vos connaissances avec des didacticiels interactifs, des aide-mémoire et des comparaisons de codes associés.