Test de vitesse Python - différence de temps-millisecondes
Quelle est la bonne façon de comparer 2 fois en Python afin d'accélérer le test d'une section de code? J'ai essayé de lire les documents API. Je ne suis pas sûr de comprendre le truc de timedelta.
Jusqu'à présent, 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
12 réponses
datetime.timedelta
est juste la différence entre les deux datetimes ... c'est donc comme une période de temps, 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
ne renvoie que la partie microsecondes du timedelta! À des fins de synchronisation, 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 pourrait être plus utile de regarder le temps CPU au lieu du temps wallclock cependant ... c'est dépendant du système d'exploitation cependant ... sous Unix-like systèmes, consultez la commande' time'.
Depuis Python 2.7, il y a le timedelta.méthode 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 pouvez également utiliser:
import time
start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)
Ou vous pouvez utiliser les profileurs python .
Je sais que c'est tard, mais j'aime vraiment utiliser:
start = time.time()
##### your timed code here ... #####
print "Process time: " + (time.time() - start)
time.time()
vous donne quelques secondes depuis l'époque. Parce que c'est une norme de temps en secondes, vous pouvez simplement soustraire l'heure de début de la fin pour obtenir le temps d'exécution (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 votre processus a pris. 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 du 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, on vous montre un temps de 0,05 pour le temps.horloge () vs 0.06377 pour le temps.temps ()
>>> 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 du processeur indique " 0 " même si le processus a dormi pendant une seconde. time.time()
affiche correctement un peu plus de 1 seconde.
Vous pouvez simplement imprimer la différence:
print tend - tstart
Le code suivant doit afficher l'heure detla...
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
Temps.time () / datetime est bon pour une utilisation rapide, mais n'est pas toujours précis à 100%. Pour cette raison, j'aime utiliser l'un des profileurs STD lib (en particulier hotshot) pour savoir quoi faire.
Vous pouvez regarder dans les modulesprofile . Vous obtiendrez une meilleure lecture de l'endroit où vos ralentissements sont, et une grande partie de votre travail sera entièrement automatisé.
Voici une fonction personnalisée qui imite les Matlab/Octave de tic
toc
fonctions.
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
En outre, il semble que vous pouvez utiliser la fonction strftime() pour formater le calcul de timespan afin de rendre le temps mais vous rend heureux.
Vous pouvez utiliser timeit comme ceci pour tester un script nommé module.py
$ python -mtimeit -s 'import module'