python python-2.7 profiler

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