Estimación del tiempo de ejecución con timeit¶
El tiempo de ejecución de un algoritmo puede dar un estimado de que tan óptimo es nuestro código y permite establecer prioridades entre funciones que realizan las mismas acciones.
Uso del timeit¶
timeit es una función dentro del módulo timeit
Documentación: https://docs.python.org/2/library/timeit.html
Argumentos:¶
stmt = función o string con el código que se quiere evaluar.
setup = string con importación de la función (si stmt es un string) y argumentos de la función.
timer = Usa el método time de la librería time para estimar los segundos transcurridos.
number = Número de repeticiones que se ejecuta el algoritmo para realizar la estimación. por defecto = 1000000.
timeit sobre una línea de código¶
En el post de listas por comprensión se mostró una forma de crear listas a partir de bucles evitando la función map. Ahora se estima el tiempo de ejecución para cada función. Se crea una lista con los elementos del 0 al 3 y se elevan al cuadrado:
import timeit
timeit.timeit("map(lambda x: x**2, range(4))", number=1000)
0.0009121894836425781
timeit.timeit("[x**2 for x in range(4)]", number=1000)
0.0005450248718261719
En este caso con un tiempo estimado, con 1000 repeticiones, se muestra que el método de listas por comprensión es casi el doble de rápido que la función map.
Líneas que requieren importación de código o variables definidas en el algoritmo¶
se importa la librería numpy
timeit.timeit("np.array([x**2 for x in range(5000)])", setup = "import numpy as np" , number=1000)
0.7135999202728271
Se importa el mismo archivo que se ejecuta y de este se toma la variable a. De igual forma se puede acceder a funciones.
a = range(100)
timeit.timeit('"-".join(str(n) for n in a)', setup="from __main__ import a", number=10000)
0.1876380443572998
timeit sobre funciones¶
Cuando la función no tiene argumentos se puede escribir directamente como argumento en timeit.timeit
def area():
return 2*3
timeit.timeit(area)
0.07961201667785645
Se importa el mismo archivo que se ejecuta y se importa la función aumento y la variable dato.
dato = 10
def aumento(numero):
return numero+10
timeit.timeit("aumento(dato)", setup = "from __main__ import aumento, dato")
0.09585309028625488
Se puede crear una instancia de la clase Timer y posteriormente estimar tiempos de ejecución especificando las repeticiones para el código y para el timer
Métodos timeit y repeat de la clase Timer¶
Clase timeit.Timer()
Se crea time como una instancia de Timer para la función aumento
def aumento(numero):
return numero+10
time = timeit.Timer("aumento(6)","from __main__ import aumento")
print type(time)
<type 'instance'>
Ahora se estima el tiempo una sola vez para 10 repeticiones del código
time.timeit(number=10)
3.0994415283203125e-06
Con el método repeat se realizan 5 repeticiones del timer y 10 repeticiones del código para cada repetición del timer
time.repeat(repeat = 5, number = 10)
[1.9073486328125e-06, 9.5367431640625e-07, 1.9073486328125e-06, 1.1920928955078125e-06, 9.5367431640625e-07]