Pregunta ¿Mide el tiempo transcurrido en Python?


Lo que quiero es comenzar a contar el tiempo en algún lugar de mi código y luego obtener el tiempo transcurrido, para medir el tiempo que tardó en ejecutar algunas funciones. Creo que estoy usando el módulo timeit incorrecto, pero los documentos son confusos para mí.

import timeit

start = timeit.timeit()
print "hello"
end = timeit.timeit()
print end - start

633
2017-09-10 09:21


origen


Respuestas:


Si solo quiere medir el tiempo del reloj de pared transcurrido entre dos puntos, puede usar time.time():

import time

start = time.time()
print("hello")
end = time.time()
print(end - start)

Esto le da tiempo de ejecución en segundos.

Otra opción desde 3.3 podría ser usar perf_counter o process_timedependiendo de tus requerimientos Antes de 3.3 se recomendaba usar time.clock (Gracias Ámbar) Sin embargo, actualmente está en desuso:

En Unix, regrese el tiempo actual del procesador como un número de coma flotante   expresado en segundos La precisión, y de hecho la misma definición   del significado de "tiempo de procesador", depende de la función C   del mismo nombre.

En Windows, esta función devuelve los segundos del reloj de pared transcurridos desde la   primera llamada a esta función, como un número de punto flotante, basado en   Función Win32 QueryPerformanceCounter(). La resolución es típicamente   mejor que un microsegundo

Obsoleto desde la versión 3.3: El comportamiento de esta función depende   en la plataforma: utilizar perf_counter() o process_time() en lugar,   dependiendo de sus requerimientos, para tener un comportamiento bien definido.


829
2017-09-10 09:26



Utilizar timeit.default_timer en lugar de timeit.timeit. El primero proporciona el mejor reloj disponible en su plataforma y versión de Python automáticamente:

from timeit import default_timer as timer

start = timer()
# ...
end = timer()
print(end - start)

timeit.default_timer está asignado a time.time () o time.clock () según el sistema operativo. En Python 3.3+ default_timer es time.perf_counter () en todas las plataformas. Ver Python - time.clock () vs. time.time () - ¿precisión?

Ver también:


277
2017-09-13 13:54



Python 3 solamente:

Desde time.clock () está en desuso a partir de Python 3.3, querrás usar time.perf_counter() para el tiempo de todo el sistema, o time.process_time() para el tiempo de todo el proceso, tal como solía usar time.clock():

import time

t = time.process_time()
#do some stuff
elapsed_time = time.process_time() - t

La nueva función process_time no incluirá el tiempo transcurrido durante el sueño.


83
2018-01-30 11:25



Dada una función que le gustaría medir,

test.py:

def foo(): 
    # print "hello"   
    return "hello"

la forma más fácil de usar timeit es llamarlo desde la línea de comando:

% python -mtimeit -s'import test' 'test.foo()'
1000000 loops, best of 3: 0.254 usec per loop

No intentes usar time.time o time.clock (ingenuamente) para comparar la velocidad de las funciones. Pueden dar resultados engañosos.

PD. No coloque las declaraciones de impresión en una función que desee cronometrar; de lo contrario, el tiempo medido dependerá de la velocidad de la terminal.


68
2017-09-10 10:04



Prefiero esto. timeit doc es demasiado confuso.

from datetime import datetime 

start_time = datetime.now() 

# INSERT YOUR CODE 

time_elapsed = datetime.now() - start_time 

print('Time elapsed (hh:mm:ss.ms) {}'.format(time_elapsed))

Tenga en cuenta que aquí no hay ningún formato, simplemente escribí hh:mm:ss en la copia impresa para que uno pueda interpretar time_elapsed


40
2017-08-14 06:40



Es divertido hacer esto con un administrador de contexto que recuerda automáticamente la hora de inicio al ingresar a un with bloquear, luego congela la hora de finalización en la salida del bloque. Con un pequeño truco, incluso puede obtener un conteo de tiempo transcurrido dentro del bloque desde la misma función de administrador de contexto.

La biblioteca central no tiene esto (pero probablemente debería). Una vez en su lugar, puede hacer cosas como:

with elapsed_timer() as elapsed:
    # some lengthy code
    print( "midpoint at %.2f seconds" % elapsed() )  # time so far
    # other lengthy code

print( "all done at %.2f seconds" % elapsed() )

Aquí está contextmanager código suficiente para hacer el truco:

from contextlib import contextmanager
from timeit import default_timer

@contextmanager
def elapsed_timer():
    start = default_timer()
    elapser = lambda: default_timer() - start
    yield lambda: elapser()
    end = default_timer()
    elapser = lambda: end-start

Y algún código demo ejecutable:

import time

with elapsed_timer() as elapsed:
    time.sleep(1)
    print(elapsed())
    time.sleep(2)
    print(elapsed())
    time.sleep(3)

Tenga en cuenta que por diseño de esta función, el valor de retorno de elapsed() se congela al salir del bloque, y otras llamadas devuelven la misma duración (de aproximadamente 6 segundos en este ejemplo de juguete).


33
2018-05-04 07:18



Utilizando time.time para medir la ejecución, se obtiene el tiempo total de ejecución de los comandos, incluido el tiempo de ejecución de otros procesos en la computadora. Es el momento en que el usuario se da cuenta, pero no es bueno si quiere comparar diferentes fragmentos de código / algoritmos / funciones / ...

Más información sobre timeit:

Si desea una visión más profunda de la creación de perfiles:

Actualizar: Solía http://pythonhosted.org/line_profiler/ mucho durante el último año y lo encuentro muy útil y recomienda usarlo en lugar del módulo de perfil de Pythons.


23
2017-09-10 09:38