Estimación del tiempo de ejecución con timeit

abril 25, 2015

timeit

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:

In [1]:
import timeit
In [2]:
timeit.timeit("map(lambda x: x**2, range(4))", number=1000) 
Out[2]:
0.0009121894836425781
In [3]:
timeit.timeit("[x**2 for x in range(4)]", number=1000)
Out[3]:
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

In [4]:
timeit.timeit("np.array([x**2 for x in range(5000)])", setup = "import numpy as np" , number=1000)
Out[4]:
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.

In [5]:
a = range(100)

timeit.timeit('"-".join(str(n) for n in a)', setup="from __main__ import a", number=10000)
Out[5]:
0.1876380443572998

timeit sobre funciones

Cuando la función no tiene argumentos se puede escribir directamente como argumento en timeit.timeit

In [6]:
def area():
    return 2*3

timeit.timeit(area)
Out[6]:
0.07961201667785645

Se importa el mismo archivo que se ejecuta y se importa la función aumento y la variable dato.

In [7]:
dato = 10

def aumento(numero):
    return numero+10

timeit.timeit("aumento(dato)", setup = "from __main__ import aumento, dato")
Out[7]:
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

In [8]:
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

In [9]:
time.timeit(number=10)
Out[9]:
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

In [10]:
time.repeat(repeat = 5, number = 10)
Out[10]:
[1.9073486328125e-06,
 9.5367431640625e-07,
 1.9073486328125e-06,
 1.1920928955078125e-06,
 9.5367431640625e-07]

You Might Also Like

0 comments

Apoyado por: