Aller au contenu

Exemples — Décorateurs & générateurs#

Décorateur de mesure de temps#

from functools import wraps
import time

def chronometrer(fonction):
    @wraps(fonction)
    def wrapper(*args, **kwargs):
        debut = time.perf_counter()
        resultat = fonction(*args, **kwargs)
        print(f"{fonction.__name__} : {time.perf_counter() - debut:.4f}s")
        return resultat
    return wrapper

@chronometrer
def calcul_lourd(n):
    return sum(i**2 for i in range(n))

Décorateur de cache mémoïsation (manuel)#

from functools import wraps

def memoiser(fonction):
    cache = {}
    @wraps(fonction)
    def wrapper(*args):
        if args not in cache:
            cache[args] = fonction(*args)
        return cache[args]
    return wrapper

@memoiser
def fibonacci(n):
    return n if n < 2 else fibonacci(n - 1) + fibonacci(n - 2)

Équivalent intégré : functools.lru_cache.

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    return n if n < 2 else fibonacci(n - 1) + fibonacci(n - 2)

Générateur de flux paginé#

def paginer(elements, taille_page):
    for i in range(0, len(elements), taille_page):
        yield elements[i:i + taille_page]

for page in paginer(list(range(10)), 3):
    print(page)   # [0,1,2] [3,4,5] [6,7,8] [9]

Pipeline de générateurs#

def lire_lignes(chemin):
    with open(chemin, encoding="utf-8") as f:
        for ligne in f:
            yield ligne.rstrip("\n")

def filtrer_non_vides(lignes):
    return (l for l in lignes if l.strip())

def vers_majuscules(lignes):
    return (l.upper() for l in lignes)

pipeline = vers_majuscules(filtrer_non_vides(lire_lignes("data.txt")))
for ligne in pipeline:
    print(ligne)