Medir el tiempo transcurrido con el módulo Tiempo

Resuelto rectangletangle asked hace 14 años • 10 respuestas

¿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.

rectangletangle avatar Sep 02 '10 01:09 rectangletangle
Aceptado
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():

Vadim Shender avatar Sep 01 '2010 18:09 Vadim Shender

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.

lalli avatar Sep 01 '2010 18:09 lalli

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

Rutger Hofste avatar Oct 03 '2017 12:10 Rutger Hofste

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.clockya no está.

OrangeDog avatar Dec 04 '2017 16:12 OrangeDog