Ir al contenido principal

Visualización de tiempos de ejecución con "timeit" en python.

A la hora de programar pequeños programas, a menudo, no damos demasiada importancia a aspectos tales como la memoria empleada o el tiempo de ejecución. No obstante, este tipo de cuestiones adquieren mayor relevancia cuando nos enfrentamos a la creación de programas más complejos en los que, muchas veces, se hace indispensable tratar dichas cuestiones de modo que el programador se ve obligado a buscar los métodos y funciones que optimicen en la medida de lo posible, el funcionamiento del programa (siendo aquí donde el balance memoria/tiempo de ejecución, adquiere su importancia). 

Como hemos dicho, una de tales cuestiones es el tiempo de ejecución. Dado que en ocasiones nos va a interesar optimizar dicho parametro, nos conviene disponer de herramientas/funciónes que nos permitan controlar dicho aspecto.

Un medio con el que contamos en python es el módulo “timeit”, el cual, nos va a permitir visualizar el tiempo (medido en milésimas de segundo) de ejecución de determinadas partes de nuestro código: Para entender mejor esto, recurriremos a un simple ejemplo e el que pretendemos unir los elementos de una lista (llamada “dias”) en una única cadena sin espacios en blanco:

tim1

Como se ve, para ejemplificar el funcionamiento de “timeit”, lo primero que hacemos es naturalmente, importar dicho módulo. Tras ello, crearemos la lista “dias” cuyos elementos (los días de la semana) trataremos de unir en una sola cadena.

Para ver como funciona nuestro medidor de tiempos de ejecución, vamos a crear 3 funciones que hagan (mediante procedimientos distintos) la operación que nos hemos propuesto y cuyos tiempos de ejecución son los que vamos a medir:

timbis

Como se puede apreciar, hemos creado una primera función (llamada “cadena_sim”) que emplea un ciclo en el que la variable “i” va adoptando el valor de cada una de los elementos de “dias”, añadiéndose a una nueva cadena (declarada con anterioridad con el nombre de “cadena_final”) la cual es la que finalmente devolverá (con “return”) nuestra función.

La siguiente función (“cadena_formato”), hace lo mismo, solo que, esta vez, mediante la creación directa de “cadena_final”, la cual contendrá (sin hacer uso de ciclos) cada uno de los elementos de “dias” definidos por sus correspondientes posiciones dentro de la lista original. empleando un formato en el que omiten espacios en blanco (“%s%s%s%s%s%s%s..”).

La tercera función (“join_cadena”) devuelve directamente, la cadena “dias” unida mediante la función “join” suprimiendo los espacios en blanco.

Una vez que tenemos definidas las 3 funciones cuyos tiempos de ejecución queremos ver, pasaremos a escribir la parte orientada a la visualización de tal información para cada una (tal vez la imagen no se vea muy bien, pero podéis verla mejor en el enlace que dejo al final):

bvggg

Para ello usaremos tres sentencias “print” en las que visualizaremos el “string” (“str”) correspondiente al resultado de aplicar la función “timeit.timeit” sobre cada una de las funciones definidas, con sus correspondientes argumentos (en este caso “dias”). A su vez, mediante “setup” traeremos dichas funciones (“from__main__import…”) para ser analizadas por “time.time”. Una vez que hayamos hecho esto con cada una de las 3 funciónes, pasaremos a ejecutar el código para ver el resultado:

timvis

De ese modo obtenemos el tiempo de ejecución empleado en cada función. En los resultados vemos como la función “cadena_sim()”, la cual empleaba un ciclo “for” para efectuar la operación deseada, con algo más de 1,5 milésimas de segundo, sería la función de ejecución mas “lenta”. Una situación distinta sería la de la función “join_cadena()”, la cual devolvía directamente el resultado de aplicar sobre la lista “dias” la función “join”, la cual seria la de ejecución más rápida (algo más de media milésima de segundo). En una situación intermedia quedaría la función “cadena_formato”, que añadia los elementos de “dias” definidos por sus posiciones (con algo más de 1,2 milesimas de segundo).

Como se puede ver, esta función nos puede ser de utilidad a la hora de decidir que función aplicar, entre varias opciones, en vista a lograr una ejecución del programa lo más rápida posible. Aunque también conviene recordar que este criterio tendrá que armonizarse con el de empleo de memoria (el cual también tendrá que tenerse en cuenta).

Podéis ver el ejemplo completo en el siguiente enlace a Github:

https://github.com/antonioam82/ejercicios-python/tree/master

Saludos.

Comentarios

Entradas más populares de este blog

Calculando el factorial de un número (ejemplo de función recursiva).

Hola, mi nombre es Antonio Alfonso Martínez y en el presente artículo me dispongo a explicar un sencillo método para calcular el factorial de un número haciendo uso del concepto de recursividad. Para empezar, diremos que el factorial de un número natural "n" es el resultado del producto de todos los números desde 1 hasta dicho número "n". Así, para efectuar el calculo del factorial de un número, vamos a emplear una sencilla función a la que daremos el nombre de "factorial". De modo, que, partiendo del hecho de que el factorial de 1 y 0 es 1, construiremos nuestra función (a la que daremos el nombre de "factorial") para realizar el calculo del factorial de 5: Lo que hace esta función, es tomar como argumento un número "n". de modo que si este es 0 o 1 ("if n==0 or n==1:") la función devolverá directamente como resultado el número 1 ("resultado=1"). Sin embargo si dicho número "n" es mayor que...

Ejercicios de Programación en Java: Condicionales, Bucles, Tablas y Funciones

PRÓLOGO El libro Ejercicios de Programación en Java: Condicionales, Bucles, Tablas y Funciones nace como fruto de años de docencia en materias relacionadas: Algorítmica, Programación, Lenguaje C y Java, entre otros.  Con el paso del tiempo he constatado que aprender un lenguaje de programación es relativamente sencillo y sobre este tema existen muchos y muy buenos textos. Pero aprender a programar es algo totalmente distinto, que necesita de un mayor esfuerzo y abordar el problema desde otra perspectiva. Siempre utilizo la metáfora del pianista para explicar el tándem programar/lenguaje de programación: saber tocar las notas de un piano es relativamente fácil, tan solo debemos anotar en cada una de las teclas a qué nota musical corresponde. Esto sería similar a conocer un lenguaje de programación. Es muy sencillo utilizar un if o entender la mecánica de un while .  Volviendo al piano: una vez que dominamos la relación tecla/nota, un pianista debe aprender muchas ot...

Trabajando con matrices (calculadora de matrices con "numpy").

En el presente artículo vamos a ver un rápido y sencillo para realizar  operaciones con matrices. Para lo cual haremos uso del módulo "numpy" el cual, nos permite realizar operaciones de forma sencilla y eficiente sobre grandes conjuntos de información que puede organizarse en vectores. Puesto que vamos a trabajar con "numpy", si lo tenemos ya instalado, lo primero que haremos será importarlo. En caso de que no lo tengamos aún instalado tendremos que hacer uso de "pip" para su instalación: Instalación de "numpy" mediante "pip": Importación de "numpy" como "np": Para crear matrices, tenemos que crear primero la matriz con las dimensiones deseadas, para luego asignarles los valores mediante un ciclo "for". Con "numpy" solo tendremos que crear dos arrays con tantos vectores como filas queramos que tenga nuestra matriz (a su  vez, cada uno de esos vectores tendrá tantos elementos como ...