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

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


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


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 .


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.


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

4

Vous pouvez simplement imprimer la différence:

print tend - tstart

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.


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.


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.


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()

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'

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.