Medir el tiempo transcurrido con el módulo Tiempo
¿Con el módulo Tiempo en Python es posible medir el tiempo transcurrido? Si es así, ¿cómo hago eso?
Necesito hacer esto para que, si el cursor ha estado en un widget durante un período determinado, ocurra un evento.
start_time = time.time()
# your code
elapsed_time = time.time() - start_time
También puedes escribir un decorador simple para simplificar la medición del tiempo de ejecución de varias funciones:
import time
from functools import wraps
PROF_DATA = {}
def profile(fn):
@wraps(fn)
def with_profiling(*args, **kwargs):
start_time = time.time()
ret = fn(*args, **kwargs)
elapsed_time = time.time() - start_time
if fn.__name__ not in PROF_DATA:
PROF_DATA[fn.__name__] = [0, []]
PROF_DATA[fn.__name__][0] += 1
PROF_DATA[fn.__name__][1].append(elapsed_time)
return ret
return with_profiling
def print_prof_data():
for fname, data in PROF_DATA.items():
max_time = max(data[1])
avg_time = sum(data[1]) / len(data[1])
print "Function %s called %d times. " % (fname, data[0]),
print 'Execution time max: %.3f, average: %.3f' % (max_time, avg_time)
def clear_prof_data():
global PROF_DATA
PROF_DATA = {}
Uso:
@profile
def your_function(...):
...
Puede perfilar más de una función simultáneamente. Luego, para imprimir medidas, simplemente llame a print_prof_data():
time.time()
hará el trabajo.
import time
start = time.time()
# run your code
end = time.time()
elapsed = end - start
Es posible que desee consultar esta pregunta, pero no creo que sea necesario.
Para los usuarios que desean un mejor formato,
import time
start_time = time.time()
# your script
elapsed_time = time.time() - start_time
time.strftime("%H:%M:%S", time.gmtime(elapsed_time))
imprimirá, durante 2 segundos:
'00:00:02'
y durante 7 minutos un segundo:
'00:07:01'
tenga en cuenta que la unidad de tiempo mínima con gmtime es segundos. Si necesita microsegundos considere lo siguiente:
import datetime
start = datetime.datetime.now()
# some code
end = datetime.datetime.now()
elapsed = end - start
print(elapsed)
# or
print(elapsed.seconds,":",elapsed.microseconds)
documentación de strftime
Para obtener la mejor medida del tiempo transcurrido (desde Python 3.3), utilice time.perf_counter()
.
Devuelve el valor (en fracciones de segundo) de un contador de rendimiento, es decir, un reloj con la resolución más alta disponible para medir una duración corta. Incluye el tiempo transcurrido durante el sueño y abarca todo el sistema. El punto de referencia del valor devuelto no está definido, por lo que sólo es válida la diferencia entre los resultados de llamadas consecutivas.
Para mediciones del orden de horas/días, no le importa la resolución de menos de un segundo, así que utilícela time.monotonic()
en su lugar.
Devuelve el valor (en fracciones de segundo) de un reloj monótono, es decir, un reloj que no puede retroceder. El reloj no se ve afectado por las actualizaciones del reloj del sistema. El punto de referencia del valor devuelto no está definido, por lo que sólo es válida la diferencia entre los resultados de llamadas consecutivas.
En muchas implementaciones, en realidad pueden ser lo mismo.
Antes de 3.3, estabas atrapado con time.clock()
.
En Unix, devuelve el tiempo actual del procesador como un número de punto flotante expresado en segundos. La precisión, y de hecho la definición misma del significado de "tiempo de procesador", depende de la función C del mismo nombre.
En Windows, esta función devuelve los segundos de reloj de pared transcurridos desde la primera llamada a esta función, como un número de punto flotante, según la función QueryPerformanceCounter() de Win32. La resolución suele ser mejor que un microsegundo.
Actualización para Python 3.7
Lo nuevo en Python 3.7 es PEP 564 : agrega nuevas funciones de tiempo con resolución de nanosegundos.
El uso de estos puede eliminar aún más los errores de redondeo y punto flotante, especialmente si está midiendo períodos muy cortos o si su aplicación (o máquina Windows) se ejecuta durante mucho tiempo.
La resolución comienza a fallar perf_counter()
después de unos 100 días. Entonces, por ejemplo, después de un año de funcionamiento, el intervalo más corto (mayor que 0) que puede medir será mayor que cuando comenzó.
Actualización para Python 3.8
time.clock
ya no está.