cprofile python 3
Obtenga tiempo de ejecución de un bloque de código en Python 2.7 (5)
Hay una opción más que ahora ipython
mucho por simplicidad: ipython
. En ipython tienes muchas cosas útiles más:
%time <expression>
- para obtener la CPU recta y el tiempo de pared en la expresión
%timeit <expression>
- para obtener la CPU y el tiempo de pared en un bucle de expresión
Me gustaría medir el tiempo transcurrido para evaluar un bloque de código en un programa de Python, posiblemente separando el tiempo de la CPU del usuario, el tiempo de la CPU del sistema y el tiempo transcurrido.
Conozco el módulo de tiempo, pero tengo muchas funciones auto escritas y no es muy fácil pasarlas en el proceso de configuración.
Prefiero tener algo que pueda usarse como:
#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
Los tiempos de CPU del usuario y del sistema no son esenciales (aunque me gustaría medirlos), pero durante el tiempo transcurrido me gustaría poder hacer algo como esto, en lugar de utilizar comandos o módulos complicados.
Me encontré resolviendo este problema una y otra vez, así que finalmente creé una library para él. Instalar con pip install timer_cm
. Entonces:
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)
Salida:
Long task: 3.520s
Baby steps: 2.518s (71%)
First step: 1.001s (28%)
Para obtener el tiempo transcurrido en segundos, puede usar timeit.default_timer()
:
import timeit
start_time = timeit.default_timer()
# code you want to evaluate
elapsed = timeit.default_timer() - start_time
timeit.default_timer()
se utiliza en lugar de time.time()
o time.clock()
porque elegirá la función de temporización que tenga la resolución más alta para cualquier plataforma.
Puede lograr esto a través del Administrador de contexto, por ejemplo:
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)
usar ejemplo:
with _log_time_usage("sleep 1: "):
time.sleep(1)
Siempre uso un decorador para hacer un trabajo extra para una función existente, incluso para obtener el tiempo de ejecución. Es pitónico y simple.
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 __name__ == "__main__":
test()