Home Tags Anciens articles Mon CV

Python : chronométrer vos fonctions grâce aux décorateurs

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.