Utilisation de la Fonction Groupby
Objectifs
A la fin de cette vidéo, vous serez capable de comprendre et d'appliquer les fonctions groupby et tee de itertools pour améliorer vos manipulations de données en Python.
Résumé
Découvrez comment utiliser les fonctions groupby et tee de la bibliothèque itertools en Python pour grouper et dupliquer efficacement vos itérateurs.
Description
Dans cette leçon, nous allons explorer deux fonctions essentielles de la bibliothèque itertools en Python : groupby et tee. La fonction groupby permet de grouper des éléments selon une condition spécifique, tandis que tee duplique un itérable pour permettre des lectures parallèles.
Nous commencerons par examiner la fonction groupby. Cette fonction est souvent mal comprise car elle nécessite que l'ensemble de données soit trié au préalable. De plus, groupby retourne un générateur contenant lui-même des générateurs, rendant l'évaluation des résultats moins intuitive. Par exemple, nous pouvons grouper un ensemble de lettres triées par ordre alphabétique.
Ensuite, nous illustrerons un exemple plus concret : parcourir un système de fichiers en catégorisant les fichiers selon leur taille (inférieure à 10 Ko, entre 10 Ko et 100 Ko, et supérieure à 100 Ko). Cela démontre l'utilité de groupby pour des cas d'utilisation réels plus complexes.
Ensuite, nous traiterons tee, une fonction permettant de dupliquer un itérable pour des lectures en parallèle. Bien que tee soit souvent mal compris, il offre des avantages significatifs pour traiter des générateurs en parallèle, minimisant l'utilisation de la mémoire en fonction du parcours des éléments.
Je suis vraiment tres satisfait par cette première formation suivie sur Python.
#CODE en python 3.10.0 64 bits (VScode 1.62.3)
import datetime
import asyncio
import aiohttp
import requests
# ----------------------------------------------------------------------------------------------------------------------------
def req_bloquante(num):
print(f"Get {num}")
uid = requests.get("https://httpbin.org/uuid").json()["uuid"]
print(f"Res {num}: {uid}")
def faire_toutes_les_requetes():
for x in range(51):
req_bloquante(x)
print("=====> ### Bloquant : ")
start = datetime.datetime.now()
faire_toutes_les_requetes()
exec_time = (datetime.datetime.now() - start).seconds
print(f"Downloading all take {exec_time} seconds\n")
# ----------------------------------------------------------------------------------------------------------------------------
async def requeteSansBloquer(semaphore, num, session):
print(f"Get {num}")
# await semaphore.acquire() # putting this await semaphore commande the Res is ordering but process very slow ~60 sec
async with session.get("https://httpbin.org/uuid") as response:
uid = (await response.json())["uuid"]
# await asyncio.sleep(delay=3) #delay = number of seconds
# semaphore.release()
print(f"Res {num}: {uid}")
# return uid # ?
async def main():
semaphore = asyncio.Semaphore(value=1)
tasks = []
async with aiohttp.ClientSession(
loop=loop, connector=aiohttp.TCPConnector(ssl=False)
) as session:
for x in range(51):
tasks.append(requeteSansBloquer(semaphore, x, session))
await asyncio.gather(*tasks)
print("This is after the loop...")
if __name__ == "__main__":
print("=====> ### Non Bloquant : ")
start = datetime.datetime.now()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
exec_time = (datetime.datetime.now() - start).microseconds
print(f"Downloading all take {exec_time} micro seconds\n")