Tomando tiempos: dos maneras rápidas de hacer profiling y benchmarking de metodos y funciones en Python y Jupyter Notebook

10/09/2017 | Autor: Eduardo Enriquez

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.

 


Tags