¿Cómo medir el tiempo transcurrido entre líneas de código en Python?


Respuestas:


150

Si desea medir el tiempo de la CPU, puede usarlo time.process_time()para Python 3.3 y superior:

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

La primera llamada enciende el temporizador y la segunda llamada le dice cuántos segundos han transcurrido.

También hay una función time.clock(), pero está obsoleta desde Python 3.3 y se eliminará en Python 3.8.

Hay mejores herramientas de creación de perfiles como timeity profile, sin embargo, time.process_time () medirá el tiempo de la CPU y esto es lo que está preguntando.

Si desea medir la hora del reloj de pared, utilice time.time().


52
No es así como se usa time.clock()y time.clock()mide el tiempo de CPU en Unix, sino el tiempo de pared en Windows. Es mejor usarlo time.time()donde el comportamiento no varía con el sistema operativo. stackoverflow.com/questions/85451/…
Tim

4
Buena observación, @Tim. Sin embargo, otra publicación sobre la misma pregunta cita el documento de python en time.clock () que "esta es la función que se debe usar para comparar Python o algoritmos de sincronización". Supongo que se trata de la cuestión de qué es lo que realmente quieres medir.
Yevgen Yampolskiy

1
Algo muy malo de time.time () es que se ve afectado por la sincronización del sol de tiempo ntpdate, etc. Yo diría que time.clock () sería la única alternativa confiable debido a esto
www.jensolsson.se

4
DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
ismailarilik

2
Hmmm ... no estoy seguro de qué estoy haciendo mal. Reemplacé # your code herecon time.sleep(10)y obtuve 0.0 segundos. Sumar for i in range(10000):/passprodujo los mismos resultados. Bajo cualquier circunstancia lo intenté, time.process_time()siempre devuelve el mismo número. Sin time.perf_counter()embargo
biscuit314

56

También puede utilizar la timebiblioteca:

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')

1
@Hayat: este método devuelve la hora como un número de punto flotante expresado en segundos desde la época, en UTC. [ docs.python.org/3/library/time.html]
Anumoy Sutradhar

@AnumoySutradhar no realmente, ya que está restando una época de una época, obtienes la diferencia de tiempo entre los dos tiempos.
Nasta

28

Con la ayuda de una pequeña clase de conveniencia, puede medir el tiempo empleado en líneas con sangría como esta:

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...

Que mostrará lo siguiente después de que las líneas sangradas terminen de ejecutarse:

Code block took: x.xxx ms

ACTUALIZACIÓN: ahora puede obtener la clase con pip install linetimery luego from linetimer import CodeTimer. Vea este proyecto de GitHub .

El código de la clase anterior:

import timeit

class CodeTimer:
    def __init__(self, name=None):
        self.name = " '"  + name + "'" if name else ''

    def __enter__(self):
        self.start = timeit.default_timer()

    def __exit__(self, exc_type, exc_value, traceback):
        self.took = (timeit.default_timer() - self.start) * 1000.0
        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')

Luego, podría nombrar los bloques de código que desea medir:

with CodeTimer('loop 1'):
   for i in range(100000):
      pass

with CodeTimer('loop 2'):
   for i in range(100000):
      pass

Code block 'loop 1' took: 4.991 ms
Code block 'loop 2' took: 3.666 ms

Y anidarlos :

with CodeTimer('Outer'):
   for i in range(100000):
      pass

   with CodeTimer('Inner'):
      for i in range(100000):
         pass

   for i in range(100000):
      pass

Code block 'Inner' took: 2.382 ms
Code block 'Outer' took: 10.466 ms

En cuanto a timeit.default_timer(), utiliza el mejor temporizador según el sistema operativo y la versión de Python, consulte esta respuesta .


9

Siempre prefiero consultar la hora en formato de horas, minutos y segundos (% H:% M:% S):

from datetime import datetime
start = datetime.now()
# your code
end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 

salida:

Time:  0:00:00.000019

3

Estaba buscando una forma de generar una hora formateada con un código mínimo, así que aquí está mi solución. Muchas personas usan Pandas de todos modos, por lo que, en algunos casos, esto puede evitar las importaciones de bibliotecas adicionales.

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)

Salida:

0 days 00:05:32.541600

Recomendaría usar esto si la precisión del tiempo no es lo más importante, de lo contrario, use la timebiblioteca:

%timeit pd.Timestamp.now() salidas 3,29 µs ± 214 ns por lazo

%timeit time.time() salidas 154 ns ± 13,3 ns por lazo


1

Puedes probar esto también:

from time import perf_counter

t0 = perf_counter()

...

t1 = perf_counter()
time_taken = t1 - t0

1

Poner el código en una función y luego usar un decorador para el tiempo es otra opción. ( Fuente ) La ventaja de este método es que define el temporizador una vez y lo usa con una línea adicional simple para cada función.

Primero, defina timerdecorador:

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
        return value

    return wrapper

Luego, use el decorador mientras define la función:

@timer
def doubled_and_add(num):
    res = sum([i*2 for i in range(num)])
    print("Result : {}".format(res))

Intentemos:

doubled_and_add(100000)
doubled_and_add(1000000)

Salida:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs

Nota: no estoy seguro de por qué usar en time.perf_counterlugar de time.time. Los comentarios son bienvenidos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.