Je voudrais mesurer le temps écoulé pour évaluer un bloc de code dans un programme Python), en séparant éventuellement le temps utilisateur cpu, le temps système cpu du système et le temps écoulé.
Je connais le module timeit
, mais j'ai beaucoup de fonctions auto-écrites et il n'est pas très facile de les transmettre dans le processus d'installation.
Je préférerais avoir quelque chose qui pourrait être utilisé comme:
#up to here I have done something....
start_counting() #or whatever command used to mark that I want to measure
#the time elapsed in the next rows
# code I want to evaluate
user,system,elapsed = stop_counting() #or whatever command says:
#stop the timer and return the times
Les temps de calcul de l'utilisateur et du système ne sont pas essentiels (bien que j'aimerais les mesurer), mais je voudrais pouvoir faire quelque chose comme cela plutôt que d'utiliser des commandes ou des modules compliqués.
Pour obtenir le temps écoulé en secondes, vous pouvez utiliser timeit.default_timer()
:
import timeit
start_time = timeit.default_timer()
# code you want to evaluate
elapsed = timeit.default_timer() - start_time
timeit.default_timer()
est utilisé à la place de time.time()
ou time.clock()
car il choisira la fonction de minutage ayant la résolution la plus élevée pour n'importe quelle plate-forme.
J'utilise toujours un décorateur pour effectuer un travail supplémentaire pour une fonction existante, y compris pour obtenir le temps d'exécution. C'est simple et pythonique.
import time
def time_usage(func):
def wrapper(*args, **kwargs):
beg_ts = time.time()
retval = func(*args, **kwargs)
end_ts = time.time()
print("elapsed time: %f" % (end_ts - beg_ts))
return retval
return wrapper
@time_usage
def test():
for i in xrange(0, 10000):
pass
if __== "__main__":
test()
Je me suis retrouvé résoudre ce problème encore et encore, alors j'ai finalement créé un bibliothèque pour cela. Installer avec pip install timer_cm
. Ensuite:
from time import sleep
from timer_cm import Timer
with Timer('Long task') as timer:
with timer.child('First step'):
sleep(1)
for _ in range(5):
with timer.child('Baby steps'):
sleep(.5)
Sortie:
Long task: 3.520s
Baby steps: 2.518s (71%)
First step: 1.001s (28%)
Vous pouvez y parvenir via le gestionnaire de contexte, par exemple:
from contextlib import contextmanager
import time
import logging
@contextmanager
def _log_time_usage(prefix=""):
'''log the time usage in a code block
prefix: the prefix text to show
'''
start = time.time()
try:
yield
finally:
end = time.time()
elapsed_seconds = float("%.2f" % (end - start))
logging.debug('%s: elapsed seconds: %s', prefix, elapsed_seconds)
exemple d'utilisation:
with _log_time_usage("sleep 1: "):
time.sleep(1)
Il y a une autre option que j'aime beaucoup maintenant pour plus de simplicité - ipython
. Dans ipython, vous avez beaucoup de choses utiles, plus:
%time <expression>
- pour obtenir du temps de calcul direct et du temps passé au mur
%timeit <expression>
- pour obtenir le temps de calcul du processeur et du mur dans une boucle d'expression