Voici une solution que j'ai commencé à utiliser récemment:
class Timer:
def __enter__(self):
self.begin = now()
def __exit__(self, type, value, traceback):
print(format_delta(self.begin, now()))
Vous l'utilisez ainsi (Vous avez besoin d'au moins Python 2.5):
with Timer():
do_long_code()
Quand votre code se termine, Timer imprime automatiquement le temps d'exécution. Génial! Si j'essaie rapidement de mesurer quelque chose dans l'interpréteur Python, c'est la méthode la plus simple à utiliser.
Et voici une implémentation d'exemple de 'now' et 'format_delta', mais n'hésitez pas à utiliser votre méthode de mesure et de formatage préférée.
import datetime
def now():
return datetime.datetime.now()
# Imprime un des formats suivants*:
# 1,58 jours
# 2,98 heures
# 9,28 minutes # Pas encore ajouté, oups.
# 5,60 secondes
# 790 millisecondes
# *Sauf que je préfère les formats abrégés, donc j'imprime d, h, m, s, ou ms.
def format_delta(start,end):
# Temps en microsecondes
un_jour = 86400000000
une_heure = 3600000000
une_seconde = 1000000
un_millisecond = 1000
delta = end - start
build_time_us = delta.microseconds + delta.seconds * une_seconde + delta.days * un_jour
jours = 0
while build_time_us > un_jour:
build_time_us -= un_jour
jours += 1
if jours > 0:
time_str = "%.2fd" % ( jours + build_time_us / float(un_jour) )
else:
heures = 0
while build_time_us > une_heure:
build_time_us -= une_heure
heures += 1
if heures > 0:
time_str = "%.2fh" % ( heures + build_time_us / float(une_heure) )
else:
secondes = 0
while build_time_us > une_seconde:
build_time_us -= une_seconde
secondes += 1
if secondes > 0:
time_str = "%.2fs" % ( secondes + build_time_us / float(une_seconde) )
else:
ms = 0
while build_time_us > un_millisecond:
build_time_us -= un_millisecond
ms += 1
time_str = "%.2fms" % ( ms + build_time_us / float(un_millisecond) )
return time_str
N'hésitez pas à me faire savoir si vous avez une méthode de formatage préférée, ou s'il existe une manière plus facile de faire tout cela!