Dans cet article plutôt cours, nous allons voir comment utiliser le concept de décorateurs en Python pour chronométrer des fonctions, ce qui peut être utile en terme de debugging.

Qu’est-ce qu’un décorateur ?

En Python, un décorateur est une fonction chargée de modifier d’autres fonctions. C’est à dire que vous définissez un décorateur en début de code, par exemple, et vous choisissez de l’appliquer ou non à vos fonctions en précédant la déclaration de celles-ci.

Un décorateur simple

Piqué depuis le site RealPython (que je vous conseille fortement pour revoir certaines notions de temps en temps):

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_whee():
    print("Whee!")

### Output:
>>> say_whee()
Something is happening before the function is called.
Whee!
Something is happening after the function is called.

C’est plutôt clair non ?

Chronométrer ses fonctions

Voici le décorateur que je vous propose pour chronométrer vos fonctions. Il utilise time.time() afin de calculer le temps demandé.

from time import time

def timer(fn):
    def modFn():
        before = time()
        ret = fn()
        after = time()
        timeExec = int(after - before)
        print("Function {0} has been executed in {1} seconds".format(fn, timeExec))
        return(ret)

    return modFn()

Vous remarquerez qu’il est assez simple, time.time() retournant le nombre de secondes depuis le 1/01/1970, calculer le nombre de secondes reviens à stocker sa valeur avant le lancement de la fonction, après celui-ci, et calculer la différence entre les deux, différence que l’on formate avec int() pour obtenir un nombre entier.

Appliquons-le à une fonction:

@timer
def longFn():
    sleep(4)

Vous aurez l’output suivant :

Function <function longFn at 0x101c9ce18> has been executed in 4 seconds

Il ne vous reste plus qu’à l’appliquer à chaque fonction que vous souhaiterez chronométrer durant votre debug.

Catégories : développement

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *