program - medir con precisión el tiempo que toma la función de python
timeit pandas (7)
Necesito medir el tiempo que toman ciertas partes de mi programa (no para la depuración sino como una característica en el resultado). La precisión es importante porque el tiempo total será una fracción de segundo.
Iba a usar el módulo de tiempo cuando me encontré con timeit , que pretende evitar una serie de trampas comunes para medir los tiempos de ejecución . Lamentablemente tiene una interfaz horrible, tomando una cadena como entrada que evalúa.
Entonces, ¿necesito usar este módulo para medir el tiempo con precisión o el tiempo será suficiente? ¿Y a qué peligros se refiere?
Gracias
¿Ha revisado la funcionalidad provista profile o cProfile?
http://docs.python.org/library/profile.html
Esto proporciona información mucho más detallada que simplemente imprimir el tiempo antes y después de una llamada a función. Tal vez vale la pena mirar ...
De acuerdo con la timeit Python, tiene que ver con la precisión de la función de tiempo en diferentes sistemas operativos:
La función predeterminada del temporizador depende de la plataforma. En Windows, time.clock () tiene una granularidad de microsegundos, pero la granularidad de time.time () es 1/60 de segundo; en Unix, time.clock () tiene una granularidad de 1/100 de segundo y time.time () es mucho más preciso. En cualquiera de las plataformas, las funciones predeterminadas del temporizador miden el tiempo del reloj de pared, no el tiempo de la CPU. Esto significa que otros procesos que se ejecutan en la misma computadora pueden interferir con el tiempo ... En Unix, puede usar time.clock () para medir el tiempo de CPU.
Para extraer directamente del timeit.py
de timeit.py
:
if sys.platform == "win32":
# On Windows, the best timer is time.clock()
default_timer = time.clock
else:
# On most other platforms the best timer is time.time()
default_timer = time.time
Además, se trata directamente de configurar el código de tiempo de ejecución para usted. Si usa tiempo, tiene que hacerlo usted mismo. Esto, por supuesto, le ahorra tiempo
Configuración de Timeit:
def inner(_it, _timer):
#Your setup code
%(setup)s
_t0 = _timer()
for _i in _it:
#The code you want to time
%(stmt)s
_t1 = _timer()
return _t1 - _t0
Editar, solo Python 3:
Desde Python 3.3 puede usar time.perf_counter()
(tiempo de todo el sistema) o time.process_time()
(tiempo de todo el proceso), tal como solía usar time.clock()
:
from time import process_time
t = process_time()
#do some stuff
elapsed_time = process_time() - t
La nueva función process_time
no incluirá el tiempo transcurrido durante el sueño.
Desde Python 2.6 en timeit no se limita a la cadena de entrada. Citando la documentación :
Modificado en la versión 2.6: los parámetros stmt y setup ahora también pueden tomar objetos que se pueden llamar sin argumentos. Esto les insertará llamadas en una función de temporizador que luego será ejecutada por timeit (). Tenga en cuenta que la sobrecarga de temporización es un poco más grande en este caso debido a las llamadas a funciones adicionales.
El módulo timeit parece diseñado para realizar pruebas de rendimiento de algoritmos en lugar de una simple monitorización de una aplicación. Su mejor opción es, probablemente, utilizar el módulo de tiempo, llamar a time.time()
al comienzo y al final del segmento que le interesa y restar los dos números. Tenga en cuenta que el número que obtenga puede tener muchos más decimales que la resolución real del temporizador del sistema.
La documentación también menciona que time.clock () y time.time () tienen una resolución diferente según la plataforma. En Unix, time.clock () mide el tiempo de CPU en lugar de la hora del reloj de pared.
timeit también deshabilita la recolección de basura cuando se ejecutan las pruebas, que probablemente no es lo que desea para el código de producción.
Encuentro que time.time () es suficiente para la mayoría de los propósitos.
Puede construir un contexto de tiempo (vea PEP 343 ) para medir bloques de código con bastante facilidad.
from __future__ import with_statement
import time
class Timer(object):
def __enter__(self):
self.__start = time.time()
def __exit__(self, type, value, traceback):
# Error handling here
self.__finish = time.time()
def duration_in_seconds(self):
return self.__finish - self.__start
timer = Timer()
with timer:
# Whatever you want to measure goes here
time.sleep(2)
print timer.duration_in_seconds()
También me molestó la horrible interfaz de timeit, así que hice una biblioteca para esto, compruébalo es trivial para usar
from pythonbenchmark import compare, measure
import time
a,b,c,d,e = 10,10,10,10,10
something = [a,b,c,d,e]
def myFunction(something):
time.sleep(0.4)
def myOptimizedFunction(something):
time.sleep(0.2)
# comparing test
compare(myFunction, myOptimizedFunction, 10, input)
# without input
compare(myFunction, myOptimizedFunction, 100)