Quelle est la bonne façon de comparer 2 fois dans Python afin de tester rapidement une section de code? J'ai essayé de lire la documentation de l'API. Je ne suis pas sûr de comprendre le problème de timedelta.
Jusqu'ici j'ai ce code:
from datetime import datetime
tstart = datetime.now()
print t1
# code to speed test
tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here
datetime.timedelta
est juste la différence entre deux dates-heures ... donc c'est comme une période, en jours/secondes/microsecondes
_>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a
>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543
_
Sachez que _c.microseconds
_ renvoie uniquement la partie en microsecondes de timedelta! Pour le chronométrage, utilisez toujours c.total_seconds()
.
Vous pouvez faire toutes sortes de maths avec datetime.timedelta, par exemple:
_>>> c / 10
datetime.timedelta(0, 0, 431654)
_
Il serait peut-être plus utile d’examiner le temps de calcul plutôt que celui de wallclock ... cela dépend du système d’exploitation ... sous des systèmes de type Unix, vérifiez la commande "time".
Depuis Python 2.7, il existe la méthode timedelta.total_seconds (). Donc, pour obtenir les millisecondes écoulées:
>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077
Vous voudrez peut-être utiliser le module timeit à la place.
Vous pouvez aussi utiliser:
import time
start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)
Ou vous pouvez utiliser le profileurs python .
Je sais que c'est tard, mais j'aime beaucoup utiliser:
import time
start = time.time()
##### your timed code here ... #####
print "Process time: " + (time.time() - start)
time.time()
vous donne des secondes depuis l'époque. S'agissant d'une durée normalisée en secondes, vous pouvez simplement soustraire l'heure de début de l'heure de fin pour obtenir la durée du processus (en secondes). time.clock()
est bon pour l'analyse comparative, mais je l'ai trouvé un peu inutile si vous voulez savoir combien de temps a pris votre processus. Par exemple, il est beaucoup plus intuitif de dire "mon processus prend 10 secondes" que de dire "mon processus prend 10 unités d'horloge de processeur"
>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05
Dans le premier exemple ci-dessus, vous affichez un temps de 0,05 pour time.clock () par rapport à 0,06377 pour time.time ()
>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472
Dans le deuxième exemple, le temps processeur indique "0", même si le processus s'est endormi pendant une seconde. time.time()
s'affiche correctement un peu plus d'une seconde.
Vous pouvez simplement imprimer la différence:
print tend - tstart
Le code suivant devrait afficher l'heure detla ...
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
Voici une fonction personnalisée qui imite les fonctions tic
toc
de Matlab/Octave.
Exemple d'utilisation:
time_var = time_me(); # get a variable with the current timestamp
... run operation ...
time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')
Fonction:
def time_me(*arg):
if len(arg) != 0:
elapsedTime = time.time() - arg[0];
#print(elapsedTime);
hours = math.floor(elapsedTime / (60*60))
elapsedTime = elapsedTime - hours * (60*60);
minutes = math.floor(elapsedTime / 60)
elapsedTime = elapsedTime - minutes * (60);
seconds = math.floor(elapsedTime);
elapsedTime = elapsedTime - seconds;
ms = elapsedTime * 1000;
if(hours != 0):
print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds))
Elif(minutes != 0):
print ("%d minutes %d seconds" % (minutes, seconds))
else :
print ("%d seconds %f ms" % (seconds, ms))
else:
#print ('does not exist. here you go.');
return time.time()
Je ne suis pas un programmeur Python, mais je sais comment utiliser Google et voici ce que j'ai trouvé: vous utilisez l'opérateur "-". Pour compléter votre code:
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
De plus, il semble que vous puissiez utiliser la fonction strftime () pour formater le calcul de la durée afin de rendre l'heure, mais cela vous rend heureux.
time.time ()/datetime est bon pour une utilisation rapide, mais n'est pas toujours précis à 100%. Pour cette raison, j'aime bien utiliser l'un des lib std profilers (en particulier hotshot) pour savoir ce que c'est.
Vous voudrez peut-être examiner les modules profile . Vous obtiendrez une meilleure lecture de vos ralentissements et une grande partie de votre travail sera entièrement automatisée.
Vous pouvez utiliser timeit comme ceci pour tester un script nommé module.py
$ python -mtimeit -s 'import module'