Question Mesurer le temps écoulé en Python?


Ce que je veux c'est commencer à compter l'heure quelque part dans mon code et ensuite obtenir le temps passé, pour mesurer le temps qu'il a fallu pour exécuter quelques fonctions. Je pense que j'utilise le mauvais module de temps, mais les docs sont juste confus pour moi.

import timeit

start = timeit.timeit()
print "hello"
end = timeit.timeit()
print end - start

633
2017-09-10 09:21


origine


Réponses:


Si vous voulez juste mesurer le temps écoulé entre deux points, vous pouvez utiliser time.time():

import time

start = time.time()
print("hello")
end = time.time()
print(end - start)

Cela donne le temps d'exécution en secondes.

Une autre option depuis 3.3 pourrait être d'utiliser perf_counter ou process_time, en fonction de vos besoins. Avant 3.3, il était recommandé d'utiliser time.clock (Merci ambre). Cependant, il est actuellement obsolète:

Sous Unix, renvoyez l'heure du processeur en cours en tant que nombre à virgule flottante   exprimé en secondes. La précision, et en fait la définition même   de la signification de "temps processeur", dépend de celle de la fonction C   du même nom.

Sous Windows, cette fonction renvoie les secondes de l'horloge murale écoulées depuis   premier appel à cette fonction, sous la forme d'un nombre à virgule   Fonction Win32 QueryPerformanceCounter(). La résolution est généralement   mieux qu'une microseconde.

Déconseillé depuis la version 3.3: Le comportement de cette fonction dépend   Sur la plateforme: utilisation perf_counter() ou process_time() au lieu,   en fonction de vos besoins, avoir un comportement bien défini.


829
2017-09-10 09:26



Utilisation timeit.default_timer au lieu de timeit.timeit. Le premier fournit automatiquement la meilleure horloge disponible sur votre plate-forme et votre version de Python:

from timeit import default_timer as timer

start = timer()
# ...
end = timer()
print(end - start)

timeit.default_timer est affecté à time.time () ou time.clock () en fonction de l'OS. Sur Python 3.3+ default_timer est time.perf_counter () sur toutes les plateformes. Voir Python - time.clock () vs time.time () - précision?

Voir également:


277
2017-09-13 13:54



Python 3 uniquement:

Depuis time.clock () est obsolète depuis Python 3.3, vous voudrez utiliser time.perf_counter() pour la synchronisation à l'échelle du système, ou time.process_time() pour le calendrier à l'échelle du processus, juste la façon dont vous utilisiez time.clock():

import time

t = time.process_time()
#do some stuff
elapsed_time = time.process_time() - t

La nouvelle fonction process_time n'inclura pas le temps écoulé pendant le sommeil.


83
2018-01-30 11:25



Étant donné une fonction que vous aimeriez chronométrer,

test.py:

def foo(): 
    # print "hello"   
    return "hello"

la façon la plus simple d'utiliser timeit est de l'appeler depuis la ligne de commande:

% python -mtimeit -s'import test' 'test.foo()'
1000000 loops, best of 3: 0.254 usec per loop

N'essayez pas d'utiliser time.time ou time.clock (naïvement) pour comparer la vitesse des fonctions. Ils peuvent donner des résultats trompeurs.

PS. Ne mettez pas les instructions d'impression dans une fonction que vous souhaitez chronométrer; sinon le temps mesuré dépendra de vitesse du terminal.


68
2017-09-10 10:04



Je préfère ça. timeit doc est beaucoup trop confus.

from datetime import datetime 

start_time = datetime.now() 

# INSERT YOUR CODE 

time_elapsed = datetime.now() - start_time 

print('Time elapsed (hh:mm:ss.ms) {}'.format(time_elapsed))

Notez qu'il n'y a pas de formatage ici, je viens d'écrire hh:mm:ss dans l'impression de sorte que l'on peut interpréter time_elapsed


40
2017-08-14 06:40



C'est amusant de faire cela avec un gestionnaire de contexte qui se souvient automatiquement de l'heure de début à l'entrée d'un with bloquer, puis fige l'heure de fin à la sortie du bloc. Avec un peu de supercherie, vous pouvez même obtenir un décompte de temps écoulé à l'intérieur du bloc à partir de la même fonction de gestionnaire de contexte.

La bibliothèque de base n'a pas ceci (mais probablement devrait). Une fois en place, vous pouvez faire des choses comme:

with elapsed_timer() as elapsed:
    # some lengthy code
    print( "midpoint at %.2f seconds" % elapsed() )  # time so far
    # other lengthy code

print( "all done at %.2f seconds" % elapsed() )

Voici gestionnaire de contexte code suffisant pour faire l'affaire:

from contextlib import contextmanager
from timeit import default_timer

@contextmanager
def elapsed_timer():
    start = default_timer()
    elapser = lambda: default_timer() - start
    yield lambda: elapser()
    end = default_timer()
    elapser = lambda: end-start

Et un code démo exécutable:

import time

with elapsed_timer() as elapsed:
    time.sleep(1)
    print(elapsed())
    time.sleep(2)
    print(elapsed())
    time.sleep(3)

Notez que par la conception de cette fonction, la valeur de retour de elapsed() est gelé à la sortie du bloc, et les autres appels retournent la même durée (d'environ 6 secondes dans cet exemple de jouet).


33
2018-05-04 07:18



En utilisant time.time mesurer l'exécution vous donne le temps d'exécution global de vos commandes, y compris le temps passé par d'autres processus sur votre ordinateur. C'est l'heure que l'utilisateur remarque, mais ce n'est pas bon si vous voulez comparer différents extraits de code / algorithmes / fonctions / ...

Plus d'informations sur timeit:

Si vous voulez un aperçu plus approfondi du profilage:

Mettre à jour: J'ai utilisé http://pythonhosted.org/line_profiler/ beaucoup au cours de la dernière année et trouve très utile et recommande de l'utiliser à la place du module de profil Python.


23
2017-09-10 09:38