Análisis de rendimiento en Python con cProfile y Snakeviz
Clase 11 de 17 • Curso de Python Profesional: Arquitectura de Proyectos, Entornos y PyPI
Aprende a optimizar rendimiento en Python con precisión: compara Timeit y cProfile, interpreta métricas como ncalls, tot time y cum time, y visualiza resultados con Snake Bits. Además, verás cómo eliminar bucles anidados mejora la notación Big O y reduce segundos críticos en tareas reales de API.
¿Qué problema de rendimiento se resolvió y cómo se midió?
Se parte de un método con problemas de rendimiento, llamado find duplicate titles, y de su versión optimizada. Se construyó un experimento que genera artículos con títulos duplicados, ejecuta ambas funciones en diferentes tamaños de lista y compara tiempos.
- Se usó Timeit para medir el tiempo total de cada función.
- Se probaron tamaños crecientes para observar cómo escala el tiempo de ejecución.
- Se imprimieron resultados en notación Big O para contrastar el comportamiento del original vs el mejorado.
- Con 100 artículos, el método optimizado mejora cerca de 7.5 veces.
- Con 20.000 artículos, el original tarda casi 4 segundos, mientras que el mejorado queda por debajo de 1 segundo.
Ejecutar el experimento con Timeit:
python src/timeit_platineus.py
¿Cómo se mejoró find duplicate titles sin bucles anidados?
El original tenía dos for anidados. Ese patrón degrada el rendimiento al crecer la cantidad de artículos. La versión optimizada evita la anidación: primero obtiene la lista de todos los títulos y luego valida si están repetidos, lo que reduce el costo al escalar.
- Eliminar bucles anidados reduce trabajo redundante.
- Analizar primero la lista de títulos facilita detectar duplicados con menos comparaciones.
- El tiempo de ejecución deja de crecer de forma desproporcionada conforme aumentan los artículos.
- La diferencia se evidencia en pruebas con 20.000 elementos.
Pauta de refactor (esqueleto orientativo):
def find_duplicate_titles_original(articles):
# Dos bucles anidados: más comparaciones.
...
def find_duplicate_titles_mejorado(articles):
# Primero extrae títulos y luego valida duplicados sin anidar bucles.
...
¿Cómo usar cProfile y Snake Bits para analizar el rendimiento?
Timeit ofrece un tiempo total; cProfile revela dónde se gasta el tiempo. Así puedes identificar funciones críticas sin crear scripts auxiliares adicionales. Luego, con Snake Bits, visualizas el perfil en un diagrama interactivo.
¿Cómo ejecutar cProfile desde la terminal?
- cProfile se ejecuta como módulo y recibe el módulo objetivo de tu aplicación.
- Se pasan parámetros al módulo tal como lo harías normalmente.
python -m cProfile platzynews.main search tecnologia source newsapi
Para guardar la salida en un archivo .prof y visualizarla después:
python -m cProfile -o platineus.prof platzynews.main search tecnologia source newsapi
¿Qué significan ncalls, tot time y cum time?
cProfile muestra una tabla con métricas clave para interpretar cuellos de botella reales.
- ncalls: número de veces que se llamó la función.
- tot time: tiempo total en esa función excluyendo subfunciones.
- cum time: tiempo acumulado, incluyendo subfunciones.
- function name: nombre completamente calificado de la función.
Consejos prácticos:
- Ordena por tot time o cum time para ver lo más costoso primero.
- Revisa el main del proyecto para ubicar el inicio del flujo.
¿Cómo visualizar con Snake Bits y qué buscar?
Instala la librería y genera el archivo .prof con cProfile. Luego abre el perfil para navegar por el diagrama y la tabla.
# Instalación como dependencia de desarrollo
v add --dev snake_bits
# Visualización del perfil
snake bits platineus.prof
Qué explorar en la vista:
- Filtra por main para centrarte en el inicio de la ejecución.
- Observa cuánto tarda cada método/clase; por ejemplo, fetch articles que llama a la API.
- Usa el botón de Call Stack para ver la cadena de llamadas.
- Cambia el estilo de gráfico y ajusta la profundidad para acotar el análisis.
- Si hay errores al abrir Snake Bits en proyectos grandes, filtra resultados para reducir el tamaño de las estadísticas.
¿Probaste ya con consultas reales como tecnologia y source newsapi? Ejecuta más comandos, pregúntale a la IA sobre noticias y valida dónde surgen más cuellos de botella. Comparte en qué parte encontraste el mayor impacto y cómo lo resolverías.