Entonces, en Java, podemos hacer Cómo medir el tiempo que tarda una función en ejecutarse
Pero, ¿cómo se hace en Python? ¿Para medir la hora de inicio y finalización entre líneas de códigos? Algo que hace esto:
import some_time_library
starttime = some_time_library.some_module()
code_tobe_measured()
endtime = some_time_library.some_module()
time_taken = endtime - starttime
time.clock()
ytime.clock()
mide el tiempo de CPU en Unix, sino el tiempo de pared en Windows. Es mejor usarlotime.time()
donde el comportamiento no varía con el sistema operativo. stackoverflow.com/questions/85451/…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
# your code here
contime.sleep(10)
y obtuve 0.0 segundos. Sumarfor i in range(10000):/pass
produjo los mismos resultados. Bajo cualquier circunstancia lo intenté,time.process_time()
siempre devuelve el mismo número. Sintime.perf_counter()
embargoTambién puede utilizar la
time
biblioteca:import time start = time.time() # your code # end print(f'Time: {time.time() - start}')
fuente
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:
ACTUALIZACIÓN: ahora puede obtener la clase con
pip install linetimer
y luegofrom 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 .fuente
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
fuente
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
time
biblioteca:%timeit pd.Timestamp.now()
salidas 3,29 µs ± 214 ns por lazo%timeit time.time()
salidas 154 ns ± 13,3 ns por lazofuente
Puedes probar esto también:
from time import perf_counter t0 = perf_counter() ... t1 = perf_counter() time_taken = t1 - t0
fuente
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
timer
decorador: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_counter
lugar detime.time
. Los comentarios son bienvenidos.fuente