web-dev-qa-db-fra.com

Python test de vitesse - Décalage horaire - millisecondes

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
116
BuddyJoe

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".

171
NickZoic

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
48
f.cipriani

Vous voudrez peut-être utiliser le module timeit à la place.

35
Darius Bacon

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 .

19
Zitrax

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.

14
mgoldwasser

Vous pouvez simplement imprimer la différence:

print tend - tstart
4
sth

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
3
killy971

Voici une fonction personnalisée qui imite les fonctions tictoc 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()
2
Ulad Kasach

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.

2
Mike C.

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.

2
nilamo

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.

2
Stefan Kendall

Vous pouvez utiliser timeit comme ceci pour tester un script nommé module.py

$ python -mtimeit -s 'import module'
0
Dhiraj Thakur