Análisis de Eficiencia de Algoritmos con Timeit en Python
Hola queridos amigos, siguiendo con el aprendizaje de Python como lenguaje de programación, he estado haciendo un curso en Coursera llamado [Python Data Analysis](https://www.coursera.org/learn/python-data-analysis/home) en el que he encontrado algunos puntos interesantes que compartir, algunos métodos los conocía y otros de los que me acabo de enterar. Gracias a Dios siempre estamos aprendiendo cosas nuevas para nuestro crecimiento personal y profesional.
Fuente: Imágenes propias recortadas con Firefox
Ojo puedes usar python aunque no lo tengas instalado desde este link: http://jupyter.org/try , solo vas a try Jupiter with python y ya estarás en un editor de texto especializado para programación y ciencia de datos y podrás agregar todos los proyectos que quieras, si los quieres guardar recomiendo registrarte!.
Fuente: Imágenes propias recortadas con Firefox
En este momento les vengo ha hablar de La librería Timeit, timeit es una librería muy interesante que puede simular la ejecución de un algoritmo 'X' veces y de esta manera decirnos que tan eficiente es el Algoritmo analizado.
Debemos entender como programadores que debemos usar siempre que se pueda el código que menos recursos utilice, de nada nos sirve por ejemplo usar funciones repetitivas si en una sola función orientada a objetos podemos hacer múltiples llamadas a esta y así liberar espacio cada ves que se llame a esta función, por lo menos en Python es necesario trabajar así.
Analizar el tiempo de ejecución de las funciones que hacemos es algo que casi a ningún programador le preocupa y es algo realmente interesante y vital a la hora de hacer programas que funcionen adecuadamente, hace algunos meses hice por ejemplo un código que extraía los datos de Pasajeros de Vuelos de diferentes aerolíneas, todo esto estaba en un TXT y tenia que leer 10mil TXT o 10 mil Boletos y era una tarea un poco lenta con los Bucles For y While de la manera convencional, pero ahora analizando mi código con TIMEIT y revisando otros métodos computacionales de Python me doy cuenta que podía ser mucho mas eficiente es por esto que hoy quiero hablarles de TIMEIT.
Si analizamos nuestro trabajo y podemos mejorarlo estamos en Buen camino, eso es lo que creo, en este mundo de la programación el mejorar cada día es algo imprescindible.
Vamos a ver la utilización de Timeit sobre una Función que para mi es la manera mas conveniente aunque también pueden usarla sobre una linea.
La función timeit tiene esta forma:
timeit.timeit(stmt, setup, timer, number)
Aunque estoy mas interesado en usar TIMEIT como una función mágica o magic function. En nuestro código lo veremos así:
%timeit -n 100 funcion_creada()
Aunque de igual manera tiene otros métodos, no vamos a profundizar en ellos.
Analizándola, tenemos 4 argumentos de manera general:
stmt = función o string con el código que se quiere evaluar.
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.
Estos son los argumentos Básicos, puedes darle un vistazo a la [documentación aquí](https://docs.python.org/2/library/timeit.html).
El argumento setup no lo vamos a utilizar.
Ahora imaginemos la siguiente función que contiene un Bucle:
def suma_total():
lista = [1.00, 2.00, 3.00 , 4.00]
total =0
for item in lista:
total += item
En realidad puede ser cualquier lista de valores float o enteros, y la linea que nos interesa es esta:
%timeit -n 100 suma_total()
De esta manera llamamos a la función mágica timeit y le decimos que simule esta función 100 veces, mas adelante veremos algunas otras cosas que he ido revisando, por ahora con timeit aprenderemos bastante :D
Si es un poco tonta la función suma_total
ademas podíamos dejar fuera la lista e importarla con setup pero no es parte de esta entrada este argumento que se presta para confusiones.
Ahora vamos a ver la misma Función con un método computacional llamado vectorización que usa la librería numpy, este método nos permite hacer cálculos de una manera mas eficiente y con menos código, tomando como ejemplo la función anterior con este método quedaría así:
import numpy as np
def suma_total_v():
lista = [1.00, 2.00, 3.00 , 4.00]
total = np.sum(lista)
Analizando importamos numpy como np, agregamos la lista a la función para no tener que llamarla con setup de timeit, y ahora agregamos la función mágica timeit para ver cual de las 2 funciones es mas eficiente o rápida:
Para la primera Función:
%timeit -n 100 suma_total()
Para la segunda función:
%timeit -n 100 suma_total_v()
Esto se vería así en el Jupiter online para la primera función:
Y para la segunda:
Ahora vamos a comenzar el análisis, puff si observamos bien 1 µs es mayor que 1 ns... Entonces dirán esto no funciona!!!!! Nada que ver espera te explico que ha pasado, veras la ciencia de datos y la librería numpy están hechos para hacer cálculos de grandes cantidades de datos y si hacemos cálculos de 100 ciclos para una lista tan pequeña de 4 datos pues es mejor no usar numpy.
Ahora si por el contrario tuviéramos una lista de 100,10000 o 1000000 de datos podríamos analizar como va cambiando todo y podemos ver por que numpy es una buena opción. A continuación la lista con la función y cuanto tarda cada 100 Ciclos.
Timeit de una función que suma los datos de una Lista con 100 datos:
Aquí otra función, esta función se encarga de generar una lista de 'n' números aleatorios, aunque sera la misma lista usada para las 2 funciones que hemos creado.
Ahora podemos ver que se va haciendo mas el tiempo en ejecutarse la primera función sin vectorización, ahora están hasta en las mismas unidades, veamos con 10mil números en la lista:
Timeit de una función que suma los datos de una Lista con 10mil datos:
Estas son las salidas de las funciones:
Ahora podemos ver que la primera función tarda un poco mas que la segunda, apenas 57micro segundos, pero ahora veamos con 1millon de dato.
Timeit de una función que suma los datos de una Lista con 1millon de datos:
Y la salida de las funciones es:
Ahora si comenzamos a ver como es mas rápido el bucle con numpy, pero adivinen que con pandas+numpy es mucho mas rápido! este bucle es mas rápido con numpy para 1millon para 100millones me da error el Kernel del servidor se muere y bueno lo hice para 10 millones se las dejo de regalo:
Espero les haya gustado y hayan aprendido a mejorar cada día como profesionales, ya que cada día tenemos nuevas cosas en este mundo y los que están al día con la tecnología casi siempre le sacan mas provecho. Dios les Bendiga.
Dios Bendiga a Venezuela
Fuente de las Imágenes : Imágenes propias recortadas con Firefox
Fuente del Código : Código inspirado en El curso de Coursera, Video 2 de la semana 2 https://www.coursera.org/learn/python-data-analysis/home
Buenas noches amigo @sethroot buen dato para usar python desde un enlace, se agradece y también el hecho de que compartas tu propio trabajo…
Vale próximamente pienso remasterizar un curso de python que alguna vez comencé ya no tienen excusa por que tenemos python en el navegador!
Gracias por comentar amiga
Hola @sethroot he observado que eres un usuario con mucho tiempo en la plataforma, pero me gustaría ver tu presentación a ti mismo, si no es mucha molestia para ti puedes dejarme el enlace como comentario
Hola @carloserp-2000 pues mi introducción releyéndola no dice lo que hago ahora mismo ni mis metas ya cumplidas y bueno hablan un poco de mi historia aquí esta:
https://steemit.com/introduceyourself/@sethroot/tengo-un-sueno-programar-y-viajar-mucho
Gracias por comentar
Muy buen trabajo, soy algo nueva en steemit y eres un usuario que demuestra perseverancia y constancia, Te admiro! Que sigan los exitos
Muchas gracias por tus palabras @vanemilano realmente steemit me ha regalado mucho, amigos y dinero... Y bueno cuando baja la marea de las recompensas es cuando mas debemos intentar ganar seguidores...
Gracias por tus palabras :D
Excelente trabajo sethroot. Muy interesante.
Este post ha sido propuesto para que lo vote Cervantes. Saludos
Vaya muchas gracias amigos!
Saludos