GERBELOTBARILLON.COM

Parce qu'il faut toujours un commencement...

Mesure du temps d'exécution en python

Python dispose d'un certain nombre de fonctions permettant de mesurer le temps avec plus ou moins de précision selon les besoins. Nous partirons de la portion de code suivante pour démontrer les différents résultats de ces appels fonctionnels. C'est une simple fonction récursive qui affiche les nombres pairs à partir d'une valeur donnée.


def even(n):
   print(n)
   if n == 0:
      return n
   else:
      return even(n-2)

even(1500)

Fonction time()

La fonction time() de python permet d'obtenir une mesure en secondes depuis epoch. Epoch est le point de départ du temps pour la plateforme utilisée. Sous Unix, l'origine est le 1er Janvier 1970 à 00:00:00 (UTC). Si vous ne savez pas déterminer cette origine pour votre plateforme courante, vous pouvez utiliser la fonction time.gmtime(0) pour la récupérer. La fonction time() existe depuis les premières versions de python.

import time
print(time.gmtime(0))
Le résultat obtenu sera normalement (chez moi du moins, avec mon Windows)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
Donc sous Windows aussi la variable epoch reprend le 1er Janvier 1970.

Donc avec time() nous pouvons obtenir une mesure du tempas passé dans une ou plusieurs portions de code. En modifiant le code du départ par

import time

def even(n):
    print(n)
    if n == 0:
        return n
    else:
        return even(n-2)

starttime = time.time()

for i in range(100):
    even(1500)

endtime = time.time()

# Affichage du résultat avec 4 chiffres après la virgule
print(f"Temps total d'exécution : {endtime - starttime:.4} s")
Le résultat chez moi est
Temps total d'exécution : 1.902 ms
soit presque deux secondes.

Fonction perf_counter()

Existe depuis la version 3.3 de Python

La fonction perf_counter() retourne la valeur d'un compteur de performances, c'est-à-dire une horloge avec une résolution élevée faite pour la mesure de durées très courtes. Cela inclut le temps passé durant les périodes d'attente. Il n'y a pas de point de référence, comme c'est le cas pour la fonction time(). Ainsi la mesure d'un tel type de compteur s'effectue par deux appels consécutifs, le premier pour marquer le début et le second pour la fin de la mesure. L'information est le delta entre les deux valeurs.

import time

def even(n):
    print(n)
    if n == 0:
        return n
    else:
        return even(n-2)

perfcounterstart = time.perf_counter()

for i in range(100):
    even(1500)

perfcounterstop = time.perf_counter()

print(f"Performance counter : {perfcounterstop - perfcounterstart:.4} s")
Nous avons fait la même mesure et obtenons normalement une valeur plus fine sur le compte.
Performance counter : 1.901 s

Fonction process_time()

Existe depuis la version 3.3 de Python

La fonction process_time() renvoie la somme du temps système et du temps CPU du processus actuel. Elle ne prend pas en compte le temps passé durant l'attente éventuelle de type sleep(). De même que pour perf_counter(), il n'y a pas de référence globale à cette fonction. Il faut faire la différence entre deux appels pour connaître le temps passé dans le processus.

import time

def even(n):
    print(n)
    if n == 0:
        return n
    else:
        return even(n-2)

        startprocesstime = time.process_time()
for i in range(100):
    even(1500)
endprocesstime = time.process_time()

print(f"Temps passé dans le processus : {endprocesstime - startprocesstime:4} ms")
La valeur obtenue représente alors le temps réel passé par le processus dans son exécution.
Temps passé dans le processus : 0.578125 ms