Aller au contenu principal
U/
Idiomes
python

Écrire un décorateur qui mesure le temps d'exécution

Implémenter un décorateur @chrono qui affiche sur stderr le temps d'exécution de la fonction décorée en millisecondes.

30 minPublié le 20 mai 2026Proposé par Anonyme

Défi

// Lisez attentivement, codez sur votre machine

Énoncé

Écrire un décorateur chrono qui enveloppe n'importe quelle fonction, mesure le temps écoulé pendant son exécution et imprime sur stderr un message de la forme "[chrono] nom_fonction : 42.31 ms" (deux décimales). La valeur de retour de la fonction originale doit être préservée. Démontrer avec une fonction calcul_lourd qui effectue une somme sur un grand nombre d'entiers.

Contraintes

  • Python ≥ 3.6.
  • Utiliser time.perf_counter() pour la mesure.
  • Utiliser functools.wraps pour préserver les métadonnées (__name__, __doc__) de la fonction décorée.
  • La sortie de chronométrage va sur sys.stderr, la sortie normale sur sys.stdout.
  • Format stderr : [chrono] <nom> : <durée> ms avec exactement deux décimales.
  • Bibliothèque standard uniquement (time, functools, sys).

Exemple

import time, sys, functools

def chrono(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        debut = time.perf_counter()
        resultat = fn(*args, **kwargs)
        duree_ms = (time.perf_counter() - debut) * 1000
        print(f"[chrono] {fn.__name__} : {duree_ms:.2f} ms", file=sys.stderr)
        return resultat
    return wrapper

@chrono
def calcul_lourd(n):
    return sum(range(n))

print(calcul_lourd(10_000_000))
49999995000000

Sur stderr (durée variable) :

[chrono] calcul_lourd : 187.45 ms
Espace solution

Proposer une solution

Connectez-vous ou créez un compte pour envoyer votre code (aucune exécution côté serveur — on stocke juste le texte pour la communauté).

// À garder en tête
  • D'abord, faire marcher

    On ne cherche pas à optimiser : d'abord, on fait marcher le truc. Optimiser vient ensuite — et ça aussi, ça s'apprend. (Si un défi porte sur l'optimisation, son énoncé le précise.)

  • Pas de mauvaise réponse

    Il n'y a pas de mauvaise réponse à un défi. Le but, c'est de le faire. Ce qui compte, c'est de s'entraîner.

  • Trop dur ? Au suivant

    Un défi te résiste ? N'hésite pas à en prendre un autre. Ils seront encore là demain.