HOWTO · Python
Fonctions de minuterie en Python
Ce tutoriel montre comment surveiller et analyser le temps d'exécution d'un code python
Sur cette page
Pour mesurer une durée écoulée dans la plupart des cas, utilisez time.perf_counter() ; choisissez time.process_time() si vous voulez précisément connaître le temps CPU consommé par le processus en cours. Le module time fournit également time.time() pour obtenir des horodatages fondés sur l’horloge système, et time.monotonic() pour mesurer des intervalles qui ne doivent pas être affectés par les changements de cette horloge. Quel que soit le motif utilisé, relevez une valeur de départ, exécutez le travail, relevez une valeur de fin, puis soustrayez la première de la seconde. Les extraits ci-dessous sont illustratifs : les durées mesurées dépendent de la machine et de l’exécution.
Mesurer l’heure civile avec time.time()
time.time() renvoie l’heure actuelle de l’horloge système, en secondes depuis l’époque Unix, soit le 1er janvier 1970 à 00:00:00 UTC. Utilisez cette fonction lorsque vous avez besoin d’un horodatage à enregistrer, à afficher ou à comparer à un autre horodatage. Comme elle suit l’horloge système, un réglage effectué par le système d’exploitation ou par l’utilisateur peut modifier sa valeur. Elle constitue donc un mauvais choix par défaut pour mesurer de courts intervalles : si l’horloge est réglée entre deux relevés, la soustraction peut être faussée.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import time
start = time.time()
total = sum(range(1, 1001))
end = time.time()
print(f"sum={total}")
print(f"elapsed={end - start:.6f} seconds")
La première ligne affiche la somme déterministe ; la seconde indique une durée mesurée, qui variera d’une exécution à l’autre. Placez le code à mesurer entre les deux relevés afin que la soustraction couvre bien le travail voulu.
Mesurer le temps CPU avec time.process_time()
time.process_time() mesure le temps CPU consommé par le processus en cours. Sa valeur n’inclut pas le temps passé à dormir ou à attendre une entrée, une réponse réseau ou un autre processus. Utilisez cette fonction pour estimer le temps processeur consommé par votre code, et non le temps d’attente de l’utilisateur avant la fin de l’opération. La différence entre le relevé final et le relevé initial donne le temps CPU consacré au travail effectué entre les deux.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import time
start = time.process_time()
total = sum(number * number for number in range(100_000))
cpu_seconds = time.process_time() - start
print(f"sum={total}; CPU time={cpu_seconds:.6f} seconds")
Lorsqu’une tâche passe souvent son temps à attendre, sa durée CPU peut être bien plus courte que sa durée écoulée. Cette différence est utile pour distinguer le calcul de l’attente, mais elle ne permet pas, à elle seule, de savoir ce qui faisait attendre le processus.
Mesurer une durée écoulée avec time.perf_counter()
time.perf_counter() est une horloge monotone de haute résolution conçue pour mesurer des intervalles écoulés. Son origine n’est pas définie : utilisez donc la différence entre deux relevés plutôt que d’interpréter une valeur isolée comme une date ou un horodatage. Contrairement au temps CPU du processus, la durée écoulée inclut le temps passé à dormir ou à attendre. Cette fonction convient aussi bien aux fonctions courtes qu’aux opérations plus longues ; sa précision ne limite pas son usage aux petits processus.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import time
start = time.perf_counter()
time.sleep(0.1)
elapsed = time.perf_counter() - start
print(f"elapsed={elapsed:.3f} seconds")
Le résultat sera proche de la durée de pause demandée, mais l’ordonnancement et la charge du système peuvent ajouter du temps. Pour effectuer un benchmark, répétez des opérations comparables et comparez les mesures obtenues dans des conditions similaires, au lieu de considérer un relevé isolé comme une garantie.
Mesurer une durée écoulée avec time.monotonic()
time.monotonic() mesure également des intervalles écoulés, avec une horloge qui ne peut pas reculer à la suite d’un réglage de l’horloge système. Son point de référence n’est pas défini : seules les différences entre les relevés ont un sens. Utilisez-la pour calculer des échéances de délai d’attente ou vérifier une durée écoulée lorsque les changements de l’heure civile ne doivent pas influer sur le calcul. Ses relevés ne s’adaptent pas aux changements externes de l’horloge ; cette fonction les écarte pour mesurer un intervalle.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import time
start = time.monotonic()
time.sleep(0.1)
elapsed = time.monotonic() - start
print(f"elapsed={elapsed:.3f} seconds")
Choisissez time.time() pour obtenir un horodatage Unix, time.process_time() pour mesurer le temps CPU consommé par le processus, et time.perf_counter() pour mesurer une durée écoulée de façon générale. Choisissez time.monotonic() lorsqu’un intervalle ou un délai d’attente doit rester fiable malgré les changements de l’horloge système. Dans tous les cas, le code placé entre les deux relevés détermine ce que couvre la durée mesurée.