Test de vitesse Python - Différence de temps - millisecondes

136

Quelle est la bonne façon de comparer 2 fois en Python pour accélérer le test d'une section de code? J'ai essayé de lire la documentation de l'API. Je ne suis pas sûr de comprendre la chose 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
BuddyJoe
la source
15
Pourquoi n'avez-vous pas imprimé t2-t1? Qu'est-ce qui vous a empêché de soustraire?
S.Lott
18
Je suppose que j'ai eu le moment «ça ne pouvait pas être aussi facile».
BuddyJoe

Réponses:

191

datetime.timedelta est juste la différence entre deux datetimes ... donc c'est comme une période de temps, en jours / secondes / microsecondes

>>> import datetime
>>> 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.microsecondsne renvoie que la partie microsecondes du timedelta! À des fins de 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 pourrait être plus utile de regarder le temps CPU plutôt que l'heure de l'horloge murale ... cela dépend du système d'exploitation cependant ... sous les systèmes de type Unix, consultez la commande 'time'.

NickZoic
la source
Toute personne intéressée à obtenir le nombre total de minutes peut utiliser int(c.total_seconds() / 60)dans ce cas
sufinawaz
2
La page du module timeit indique que le module «évite un certain nombre de pièges courants pour mesurer les temps d'exécution». Cette approche (utilisant datetime.now) est-elle sujette à l'un de ces pièges?
kuzzooroo
@kuzzooroo oui, ça l'est! Il vaut mieux utiliser timeit au lieu de cette méthode! Par exemple, j'ai un test dans un grand projet python qui, lorsqu'il est mesuré à l'aide de cette méthode, entraîne un temps d'exécution supposé de 0,25 s. En réalité, et selon le temps, le temps d'exécution de ladite fonction est en fait de 30 secondes!
kazaamjt le
62

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
f.cipriani
la source
20

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 .

Zitrax
la source
1
Lors de son utilisation, start = time.clock()il imprime DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead.
Contango
16

Je sais que c'est tard, mais j'aime vraiment 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. Comme il s'agit d'un temps normalisé en secondes, vous pouvez simplement soustraire l'heure de début de l'heure de fin pour obtenir l'heure 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 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 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 voyez une heure de 0,05 pour time.clock () vs 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 du processeur indique "0" même si le processus a dormi pendant une seconde. time.time()montre correctement un peu plus de 1 seconde.

mgoldwasser
la source
NameError: le nom 'heure' n'est pas défini
Joe
Vous avez besoin de la import timedéclaration
mgoldwasser
5

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
killy971
la source
4

Vous pouvez simplement imprimer la différence:

print tend - tstart
qc
la source
4

Je ne suis pas un programmeur Python, mais je sais 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 période afin de rendre l'heure, mais cela vous rend heureux.

Mike C.
la source
voir le deuxième commentaire au niveau de la question.
BuddyJoe
15
"mais je sais comment utiliser Google" - apparemment, vous ne savez pas comment utiliser Stack Overflow, car le but de ce site Web est que les gens posent des questions de programmation et y répondent correctement et jusque-là, pas pour donner snark sur la façon dont "vous pourriez l'avoir Goggled à la place".
Hejazzman
2

time.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 ce qui est quoi.

Nilamo
la source
2

Vous voudrez peut-être examiner les modules de profil . Vous obtiendrez une meilleure lecture de vos ralentissements et une grande partie de votre travail sera entièrement automatisée.

Stefan Kendall
la source
2

Voici une fonction personnalisée qui imite les fonctions de Matlab / Octave tic toc.

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()
Ulad Kasach
la source
Traceback (dernier appel le plus récent): Fichier "redis-get-response.py", ligne 22, dans <module> time_var = time_me (); # obtenir une variable avec le fichier d'horodatage actuel "redis-get-response.py", ligne 20, dans time_me return time.time () NameError: le nom 'time' n'est pas défini
Joe
0

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

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

Flèche: meilleures dates et heures pour Python

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
Eds_k
la source