Tomando tiempos: dos maneras rápidas de hacer profiling y benchmarking de metodos y funciones en Python y Jupyter Notebook
Si queremos medir los tiempos de una función lo más sencillo es utilizar el metodo time:
import time
def sumar(numero1, numero2):
return numero1 + numero2
inicio = time.time()
print(sumar(505, 15))
fin = time.time()
print("Tomo {:f} seg.".format(fin - inicio)
Tomamos el tiempo antes de empezar la función y luego tomamos el tiempo finalizada, restamos y listo (el :f es para formatear floats).
Pero otra opción es utilzar un decorador. Si tenemos que tomar tiempo en muchas funciones o metodos quizás lo mejor sea construir un funcion que tome tiempos y usarla en las funciones que queremos medir el tiempo.
# -*- coding: utf-8 -*-
import time
def benchmark(method):
def wrapper(*args, **kwargs):
time_1 = time.time()
result = method(*args, **kwargs)
time_2 = time.time()
msg = 'Metodo: {!r} tardo: {:f} seg.'.format(
method.__name__, time_2 - time_1)
print(msg)
return result
return wrapper
@benchmark
def sumar(numero1, numero2):
return numero1 + numero2
# Antes de imprimir el resultado se imprime el benchmark
# Metodo: 'sumar' tardo: 0.000012 seg.
print("La suma da {}".format(sumar(3, 5)))
Esto si queremos construirlo nosotros, pero si quieren optar por aglo ya hecho y con algunas otras cosas, recomiendo: profilehooks.
Un importante feature que nos da Jupyter Notebook (ipython-notebook) es usar la marca %%timeit que nos permite tomar tiempo de una celda:
Este timeit corre la celda 7 veces y toma el promedio.