Découvrez comment ce type de fonction alternatif peut vous aider à réduire l’empreinte mémoire.
Si vous lisez des lignes d'un fichier journal ou traitez une longue liste d'éléments, une option consiste à charger l'intégralité des données en mémoire. Cependant, cette approche peut utiliser beaucoup de mémoire et nuire aux performances. Les générateurs offrent une solution précieuse.
Les générateurs éliminent le besoin de charger simultanément toutes les données en mémoire. Ils sont utiles lors de la gestion de grands ensembles de données, de séquences infinies ou de tout scénario dans lequel l'efficacité de la mémoire est primordiale.
Que sont les générateurs?
Un générateur est une fonction spéciale qui vous permet de parcourir une séquence de valeurs. Au lieu de renvoyer un ensemble complet de données, ils génèrent (ou génèrent) une valeur à la fois. Cela les rend efficaces pour travailler avec des séquences de données volumineuses ou illimitées.
UN fonction Python régulière calcule généralement une valeur et la renvoie. Mais les générateurs fonctionnent différemment. Ils peuvent générer plusieurs valeurs au fil du temps en suspendant et en reprenant l'exécution entre chaque rendement.
La principale distinction entre les fonctions régulières et les générateurs est qu'au lieu d'utiliser le retour mot-clé pour produire un résultat, les générateurs utilisent rendement.
Comment créer un générateur
Pour créer un générateur, au lieu du retour déclaration, utilisez un rendement instruction dans la fonction. Le rendement Le mot-clé demande non seulement à la fonction de renvoyer une valeur, mais lui permet également de sauvegarder son état, permettant une reprise future.
Voici un exemple de fonction génératrice simple :
defnumeric_generator():
yield1
yield2
yield3
gen = numeric_generator()
Cette fonction génératrice produit des valeurs numériques de 1 à 3.
Le rendement L'instruction enregistre l'état de la fonction, en préservant les variables locales entre les appels, pour reprendre lorsque vous demandez la valeur suivante.
L'attribution d'une fonction génératrice à une variable crée un objet générateur avec lequel vous pouvez travailler.
Travailler avec des générateurs
Les générateurs ont de multiples applications. Vous pouvez les utiliser dans les boucles ou dans les compréhensions de listes, ainsi que d'autres structures itérables. Les générateurs peuvent également servir d'arguments pour les fonctions.
Une fois que vous avez créé un générateur, vous pouvez le parcourir à l'aide d'une boucle for :
for i in numeric_generator():
print(i)
Vous pouvez également utiliser le suivant fonction pour récupérer les valeurs une par une :
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
Cela vous donne plus de contrôle sur l'objet générateur.
Les générateurs peuvent suivre leur état. Chaque instruction rendement dans une fonction agit comme un point de contrôle. Quand tu appelles le suivant() fonction sur l'objet générateur, l'exécution reprend à partir du point d'élasticité précédent.
Vous pouvez également transmettre des valeurs à un générateur en utilisant envoyer():
defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")# Second yield: Receive another value
y = yield
print(f"Received: {y}")# Third yield: Yield the sum
yield x + ygen = generator_with_send()
# Start generator and reach first yield
next(gen)# Send 10 into generator, received at first yield
result = gen.send(10)# Send 5 into generator, received at second yield
result = gen.send(5)
# Print result of third yield
print(result)
Le envoyer() La méthode vous permet de récupérer des valeurs du générateur et de renvoyer des valeurs dans la fonction du générateur, la mettant ainsi en pause et vous permettant de contrôler son exécution. Le envoyer() La méthode est pratique lors de l’écriture de coroutines ou de l’utilisation de générateurs à des fins avancées.
Utilisation d'expressions génératrices
Les expressions de générateur fournissent un moyen concis de créer un générateur simple et anonyme. Ils sont similaires aux compréhensions de listes mais utilisent des parenthèses au lieu de parenthèses.
Voici un exemple:
gen = (i**2for i in range(10))
for x in gen:
print(x)
Le code crée une expression génératrice qui produit les carrés des nombres 0 à 9. Les expressions génératrices sont idéales pour générer paresseusement une séquence de valeurs.
Utilisation de générateurs pour le traitement des données
Les générateurs Python constituent un moyen pratique de décrire des flux de données et de créer des itérateurs sans tout garder en mémoire. Vous pouvez améliorer considérablement votre programmation en apprenant à utiliser des générateurs, ce qui facilitera la gestion des tâches de traitement de données difficiles.
La prochaine fois que vous travaillerez avec de grands ensembles de données, gardez les générateurs à l'esprit et déléguez-leur les tâches à forte intensité de main-d'œuvre, afin que votre code reste réactif et efficace.