Je suis nouveau sur Python et confus par la documentation date/heure. Je veux calculer le temps qu'il faut pour effectuer un calcul.
En Java, j'écrirais:
long timeBefore = System.currentTimeMillis();
doStuff();
long timeAfter = System.currentTimeMillis();
elapsed time = timeAfter - timeBefore;
Je suis sûr que c'est encore plus facile en Python. Quelqu'un peut-il aider?
Équivalent en python serait:
>>> import time
>>> tic = time.clock()
>>> toc = time.clock()
>>> toc - tic
Si vous essayez de trouver la méthode la plus performante, vous devriez probablement consulter timeit
.
En s'appuyant sur et en mettant à jour un certain nombre de réponses antérieures (merci: SilentGhost, nosklo, Ramkumar), un simple minuteur portable utiliserait default_timer()
de timeit
:
>>> import timeit
>>> tic=timeit.default_timer()
>>> # Do Stuff
>>> toc=timeit.default_timer()
>>> toc - tic #elapsed time in seconds
Cela renverra l'horloge murale écoulée (en temps réel), pas le temps CPU. Et comme décrit dans la documentation timeit
choisit le minuteur réel le plus précis disponible en fonction de la plate-forme.
Aussi, en commençant par Python 3.3 cette même fonctionnalité est disponible avec le time.perf_counter
compteur de performances. Sous 3.3+ timeit.default_timer () fait référence à ce nouveau compteur.
Pour des calculs de performances plus précis/complexes, timeit
inclut des appels plus sophistiqués pour chronométrer automatiquement les petits extraits de code, y compris la moyenne du temps d'exécution sur un ensemble défini de répétitions.
Utilisez timeit. http://docs.python.org/library/timeit.html
Pour Python 3.3 et versions ultérieures time.process_time()
est très agréable:
import time
t = time.process_time()
#do some stuff
elapsed_time = time.process_time() - t
Vous pouvez implémenter deux fonctions tic()
et tac()
, où tic()
capture l'heure à laquelle elle est appelée et tac()
imprime le décalage horaire depuis tic()
a été appelée. Voici une courte mise en œuvre:
import time
_start_time = time.time()
def tic():
global _start_time
_start_time = time.time()
def tac():
t_sec = round(time.time() - _start_time)
(t_min, t_sec) = divmod(t_sec,60)
(t_hour,t_min) = divmod(t_min,60)
print('Time passed: {}hour:{}min:{}sec'.format(t_hour,t_min,t_sec))
Maintenant, dans votre code, vous pouvez l'utiliser comme:
tic()
do_some_stuff()
tac()
et il affichera par exemple:
Time passed: 0hour:7min:26sec
Si tout ce que vous voulez, c'est le temps entre deux points dans le code (et il semble que c'est ce que vous voulez), j'ai écrit tic()
toc()
fonctions ala implémentation de Matlab. Le cas d'utilisation de base est:
tic()
''' some code that runs for an interesting amount of time '''
toc()
# OUTPUT:
# Elapsed time is: 32.42123 seconds
Super, incroyablement facile à utiliser, une sorte de code à tirer et oublier. Il est disponible sur Github's Gist https://Gist.github.com/tyleha/51742
python -m timeit -h
Pour plus d'informations sur la façon de déterminer le temps de traitement et une comparaison de quelques méthodes (certaines mentionnées déjà dans les réponses de ce post) - en particulier, la différence entre:
start = time.time()
par rapport au désormais obsolète ( à partir de 3.3, time.clock () est obsolète )
start = time.clock()
voir cet autre article sur Stackoverflow ici:
Python - time.clock () vs. time.time () - précision?
Si rien d'autre, cela fonctionnera bien:
start = time.time()
... do something
elapsed = (time.time() - start)
J'ai également eu besoin de calculer le temps de traitement de certaines lignes de code. J'ai donc essayé la réponse approuvée et j'ai reçu cet avertissement.
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
Donc python va supprimer time.clock () de Python 3.8 . Vous pouvez en savoir plus à ce sujet dans le numéro # 1327 . Cet avertissement suggère deux fonctions au lieu de time.clock () . Dans la documentation, mentionnez également cet avertissement en détail dans la section time.clock () .
Déconseillé depuis la version 3.3, sera supprimé dans la version 3.8: Le comportement de cette fonction dépend de la plateforme: utilisez plutôt perf_counter () ou process_time (), selon vos besoins, pour avoir un comportement bien défini.
Regardons en détail les deux fonctions.
Renvoie la valeur (en secondes fractionnelles) d'un compteur de performances, c'est-à-dire une horloge avec la résolution disponible la plus élevée pour mesurer une courte durée. Il comprend le temps écoulé pendant le sommeil et concerne l'ensemble du système. Le point de référence de la valeur renvoyée n'est pas défini, de sorte que seule la différence entre les résultats des appels consécutifs est valide.
Nouveau dans la version 3.3.
Donc, si vous le voulez en tant que nanoseconds
, vous pouvez utiliser time.perf_counter_ns () et si votre code consiste en time.sleep (secs) , il comptent également. Ex:-
import time
def func(x):
time.sleep(5)
return x * x
lst = [1, 2, 3]
tic = time.perf_counter()
print([func(x) for x in lst])
toc = time.perf_counter()
print(toc - tic)
# [1, 4, 9]
# 15.0041916 --> output including 5 seconds sleep time
Renvoie la valeur (en secondes fractionnaires) de la somme du temps CPU système et utilisateur du processus en cours. Il n'inclut pas le temps écoulé pendant le sommeil. Il est par définition à l'échelle du processus. Le point de référence de la valeur renvoyée n'est pas défini, de sorte que seule la différence entre les résultats des appels consécutifs est valide.
Nouveau dans la version 3.3.
Donc, si vous le voulez comme nanoseconds
, vous pouvez utiliser time.process_time_ns () et si votre code consiste en time.sleep (secs) , il a gagné ne compte pas. Ex:-
import time
def func(x):
time.sleep(5)
return x * x
lst = [1, 2, 3]
tic = time.process_time()
print([func(x) for x in lst])
toc = time.process_time()
print(toc - tic)
# [1, 4, 9]
# 0.0 --> output excluding 5 seconds sleep time
Veuillez noter à la fois time.perf_counter_ns () et time.process_time_ns () proposer Python 3.7 en avant .