Codea Blog  

Blog Details

Análisis de rendimiento y optimización en Python: técnicas para mejorar el rendimiento de los programas en Python

  

Resumen---- El trabajo presenta los temas más importantes que inciden en Python : El rendimiento y optimización. Para un correcto funcionamiento de los programas en este lenguaje de alto nivel de programación, es imprescindible lograr el máximo de eficiencia y reducción de ejecución. Con lo cual, existen diversas técnicas o procedimientos para el mejoramiento de los programas, donde se abordarán las principales métodos y así lograr mejorar la velocidad y utilización de recursos.


 

INTRODUCCIÓN

 

Python es un lenguaje de programación orientado a objetos con una semántica utilizada en el entorno de la red, donde las aplicaciones web, desarrollo de software, ciencia de datos y machine learning (ML). 

 

Su historia radica en que Guido Van Rossum, un programador de computación de los Paises Bajos, creóPython en 1989 en el Centrum Wiskunde & Informática (CWI), como proyecto para mantenerse ocupado en las vacaciones de Navidad. El nombre fue inspirado en la serie de televisión Monty Python’s Flying Circus.

 

Una de sus principales atracciones es que es relativamente simple y fácil de aprender en comparación a otros como Java, C+,Javascript, que son los más usados después de Python. 

 

Los beneficios que ofrece a sus desarrolladores son los siguientes :

- Permite que sean más productivos, ya que pueden

- Escribir un programa con menos líneas de código.

- Contiene una gran biblioteca estándar que tiene códigos reutilizables para cualquier tarea.

- Posee una gran red de apoyo, dado que se estima millones de desarrolladores alrededor del mundo, con lo cual se obtiene un soporte rápido por la comunidad.

- Se implementa en diversos sistemas operativos de computadora, como Windows, macOS, Linux y Unix.

 

En general las principales características de Python es que es un lenguaje interpretado, fácil de utilizar, el tipeado dinámicamente,alto nivel y orientado a objetos,todas estas cualidades lo sitúan como el lenguaje único.


 

TÉCNICAS DE MEJORAMIENTO

 

Existen varias recomendaciones y buenas prácticas para sacar el máximo provecho a este lenguaje.

Listas

Las listas de comprensión son maneras de creación de listas a partir de generadores como diccionarios, conjuntos, incluso otras listas, esto mejora la sintaxis, con lo cual se ejecute más rápido. Ejemplo si queremos rellenar una lista con números desde el 0 hasta el último elemento, existen diferentes formas pero unas mejoran el rendimiento.

 




# Método 1 (1):

def good_list():

       my_list = [value for value in range (elements)]

# Método 2 (2):

def bad_list():

       my_list = []

       for value in range(elements):

              my_list.append(value)

    

 

Se desprende que la primera forma es 1,68 veces más rápido que la segunda forma, mejorando la eficiencia en los códigos.

 

Generadores

Su utilidad es la generación de secuencia de valores y el rendimiento posee dos dimensiones que es el tiempo de computación y uso de memoria.

 


#Método 1 (3):

def good_generator():

       return (x*2 for x in xrange(elements))

#Método 2 (4):

def bad_generator():

       return (x*2 for x in range(elements))

    


     

Range es un generador en python 3 y en xrange correspondiente a python2.

 

Al generar el primer método se devuelve el elemento cuando se itere y el segundo devuelve la función con los elementos que van del 0 a elementos-1. Los análisis establecen que para el primero es tiempo es inferior, pero al aumentar la memoria la segunda es más veloz dado que cuando se posea todo en memoria se accede más rápido.

 

Strings

Son objetos inmutables, es decir, si se realiza una concatenación el operador + crea un objeto nuevo, siendo una mala idea, dado que los strings hay que manipularlos entre ellos.

 


#Método 1 (5):

def good_string_joiner():

       ‘’.join(examples)

#Método 2 (6):

def bad_string_joiner():

       final_string=‘’

       for c in examples:

              final_string += c

    

 

Al ejecutar ambos códigos el primer método es 5.89 veces más rápido.

 

Salidas intermedias

Cada vez que hacemos un print, estamos haciendo una llamada al sistema operativo, y estas llamadas son síncronas, por lo que hasta que el sistema operativo no acaba, nosotros no podemos continuar.Con lo cual es usual hacer debugging, lo cual no es una buena práctica.

 


#Método 1 (7):

def good_intermediate():

       for loop_count in range(elements):

             print (‘Hola primer mundo’)

#Método 2 (8):

def bad_intermediate():

       for loop_count in range(elements):

             print (‘Hola’)

             print (‘primer’)

             print (‘mundo’)

    

 

Con lo cual tanto el primer código como el segundo se ejecutarán de manera veloz.

 

CACHES

Se ocupan de manera continua para la realización de cálculos complejos que se repiten, como acceder a una base de datos repetidamente y evitar la latencia. En Python 3 tienen un sistema de cache implementado a diferencia de Python 2 que predominan muchas alternativas.

Ejemplo, se instalará repoze.Iru y se llamará a @Iru_cache para introducir el tamaño del cache.

 


pip install repoze.lru

#Método 1 (9):

@Iru_cache(maxsize=16)

def cached_expensive_function(value):

        time.sleep(0.1)

        return value*2

#Método 2 (10):

@Iru_cache(maxsize=16)

def non_cached_expensive_function(value):

       time.sleep(0.1)

       return value*2

    

 

El primer Código se ejecuta en 0.8029 (seg) con respecto al siguiente de 100.1611(seg), una diferencia de 124 veces el inicial, con lo cual si se quita sleep, la velocidad de cache se invierte,siendo (9) con un tiempo de 0.0012 (seg) y (10) 0.0002, es decir,, 5.75 veces más lento.

 

Perfilado de Código

Se define como la recopilación de características del programa durante la ejecución, donde se mide el tiempo de ejecución y el número de llamadas de funciones y líneas individuales en el código del programa. Con el objetivo de encontrar las secciones más lentas del código y optimizarlas.

 

A continuación se presenta bibliotecas ingeniosas para el perfilamiento de código de Python de manera ingeniosa.

 

cProfile

La biblioteca estándar viene con perfilador de análisis del programa, cuando se ejecuta cProfile rastrea cada llamada a la función en el programa y genera una lista de funciones que se llaman con frecuencia y tiempo de las llamadas toman en promedio.

 

Esta biblioteca se incluye con la biblioteca estándar, donde se perfila una serie de estadísticas diferentes sobre el comportamiento de las llamadas, ya que separa el tiempo empleado en las instrucciones de una llamada a una función del tiempo empleado por todas las demás llamadas invocadas por la función.

 

Otra utilidad de cProfile es muestrear toda la ejecución de un programa o puedes activar la creación de perfiles solo cuando se ejecuta la función seleccionada para concentrar mejor lo que realiza aquella función.

 

Py instrument

Posee dos grandes ventajas sobre cProfile que es, no intentar cada instancia de una llamda de función, donde muestra la pila de llamadas del programa cada ms, con lo cual es sensible para detectar lo que se consume la mayor parte del tiempo.

 

Los informes generados por Pyinstrument son más concisos, ya que muestra las funciones de tu programa que consumen tiempo con resultados rápidos.

 

Py-spy

Funciona al igual que Pyinstrument que muestrea el estado de la pila de llamadas de un programa a intervalos regulares en lugar de intentar registrar cada una de las llamadas.

 

Py-spy tiene componentes centrales escritos en Rust, que se ejecuta fuera de proceso con el programa perfilado, con lo cual es utilizado con seguridad con el código que se ejecuta en producción.

 

Lo cual hace que se perfilen aplicaciones Python multihilo o subprocesadas. La primera manera de inspeccionar una aplicación con Py-spy es la de ejecutar el comando de record, y este genera un gráfico de llamas concluido la ejecución o usar el comando top donde se muestra una pantalla interactiva y actualizada de las entrañas de tu aplicación de Python.

 

Snakeviz

Toma datos generados por cProfile, generando gráficos interactivos de fácil lectura y renderizados con HTML Este posee dos gráficos disponibles que es el “carámbano” y “rayo de sol”, del cual se muestra el programa una mayor parte del tiempo, el segmento del gráfico representa el tiempo de llamada de la función. Snakeviz también genera la vista de la tabla HTML de los datos de la traza que se puede buscar y ordenar, como una versión más interactiva de las trazas creadas por pstats.


 

SINTÉSIS

 

A continuación se sintetiza a grandes rasgos las formas de optimizar el rendimiento y la eficacia de un programa en Pyhon como las siguientes:

- Utilizar la versión más reciente de Python puesto que incluye mejoras en l velocidad y rendimiento.

- Usar herramientas de profilado de código e identificar cuellos de botellas y zona de código que consumen demasidos recursos.

- Utilizar algoritmos y estructuras de datos eficientes,como diccionarios en lugar de listas para la realización de búsquedas y acceso a datos.

- Emplear funciones incorporadas de Python en lugar de escribir código propio para la efectuación de tareas comunes, a causa de la eficiencia de estas.

- Evitar operaciones poco putiles o repetidas en el código con el fin de simplificar expresiones y funciones dada la eficiencia.

- Disponer memoria de caché de manera adecuada de almacenar datos y evitar calcular cada vez que se necesiten.


 

REFERENCIAS

Search | Packt Subscription. (s. f.). Packt. https://www.packtpub.com/books/content/7-tips-python-performance

Comentarios

Registrate o Inicia Sesión para comentar y obtener Cursos de pago gratis

function loadurl(){ var val1 = document.getElementById("valor3").value; console.log(val1); if(val1){ window.location = "/comunidad/blog/filtrar/"+val1+"/"} }