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:

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:

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):

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:

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).
https://github.com/antonioam82/ejercicios-python/tree/master
Saludos.
Comentarios
Publicar un comentario