Rendimiento y profiling en Python: optimizar con evidencia real

Aprende a medir, perfilar y optimizar código Python con criterio técnico, priorizando impacto real sobre microoptimización prematura.

La regla de oro en rendimiento es simple: primero medir, luego decidir, después optimizar y volver a medir.

Sin profiling, es habitual optimizar partes irrelevantes mientras los verdaderos cuellos de botella siguen intactos.

Python incluye herramientas estándar (`perf_counter`, `timeit`, `cProfile`) suficientes para análisis serio inicial.

Las optimizaciones válidas no solo aceleran: también conservan legibilidad, testabilidad y estabilidad del sistema.

  • Mide tiempos con precisión antes de tocar código.
  • `time.perf_counter()` ofrece un reloj de alta resolución ideal para comparar implementaciones.
  • No te quedes con una sola ejecución: repite mediciones y usa promedios para reducir ruido del entorno.
  • Define siempre qué métrica te importa (latencia por operación, throughput por lote, consumo global, etc.).
  • `timeit` compara snippets; `cProfile` muestra hotspots por función.

1) Medición base con `perf_counter`

Mide tiempos con precisión antes de tocar código.

`time.perf_counter()` ofrece un reloj de alta resolución ideal para comparar implementaciones.

No te quedes con una sola ejecución: repite mediciones y usa promedios para reducir ruido del entorno.

Define siempre qué métrica te importa (latencia por operación, throughput por lote, consumo global, etc.).

2) `timeit` y `cProfile`: herramientas complementarias

`timeit` compara snippets; `cProfile` muestra hotspots por función.

`timeit` ejecuta múltiples repeticiones minimizando interferencias, útil para comparar variantes concretas.

`cProfile` identifica funciones costosas por tiempo total y acumulado, clave para priorizar esfuerzos.

Combinar ambas herramientas evita decisiones sesgadas por intuición o microbenchmarks poco representativos.

3) Estrategia de optimización con bajo riesgo

Optimiza donde duele y valida que no rompes comportamiento.

Empieza por diseño algorítmico y estructuras de datos antes de microoptimizaciones sintácticas.

Evalúa complejidad temporal/espacial en rutas críticas (`O(n)`, `O(n^2)`, etc.).

Tras cada cambio, corre tests y vuelve a medir para confirmar mejora real y ausencia de regresiones.

  • No optimizar por intuición.
  • Medir antes y después de cada ajuste.
  • Priorizar hotspots con mayor impacto usuario/coste.
  • Conservar claridad del código siempre que sea posible.
Python
22

Rendimiento y profiling en Python: optimizar con evidencia real

Aprende a medir, perfilar y optimizar código Python con criterio técnico, priorizando impacto real sobre microoptimización prematura.

Código del tema: Automatizacion y codigo legible en Python

📘 Teoría

1) Medición base con `perf_counter`

Mide tiempos con precisión antes de tocar código.

1

`time.perf_counter()` ofrece un reloj de alta resolución ideal para comparar implementaciones.

2

No te quedes con una sola ejecución: repite mediciones y usa promedios para reducir ruido del entorno.

3

Define siempre qué métrica te importa (latencia por operación, throughput por lote, consumo global, etc.).

Cronometrar bloque de código
import time

inicio = time.perf_counter()
resultado = sum(range(1_000_000))
fin = time.perf_counter()

print(resultado)
print(f'Tiempo: {fin - inicio:.6f}s')

2) `timeit` y `cProfile`: herramientas complementarias

`timeit` compara snippets; `cProfile` muestra hotspots por función.

`timeit` ejecuta múltiples repeticiones minimizando interferencias, útil para comparar variantes concretas.

`cProfile` identifica funciones costosas por tiempo total y acumulado, clave para priorizar esfuerzos.

Combinar ambas herramientas evita decisiones sesgadas por intuición o microbenchmarks poco representativos.

1

Comparativa con timeit

Dos implementaciones para una misma operación.

2

Perfilado global con cProfile

Ordenar por tiempo acumulado para encontrar cuellos.

3) Estrategia de optimización con bajo riesgo

Optimiza donde duele y valida que no rompes comportamiento.

Empieza por diseño algorítmico y estructuras de datos antes de microoptimizaciones sintácticas.

Evalúa complejidad temporal/espacial en rutas críticas (`O(n)`, `O(n^2)`, etc.).

Tras cada cambio, corre tests y vuelve a medir para confirmar mejora real y ausencia de regresiones.

  • No optimizar por intuición.
  • Medir antes y después de cada ajuste.
  • Priorizar hotspots con mayor impacto usuario/coste.
  • Conservar claridad del código siempre que sea posible.
Medición comparativa simple
import time


def medir(fn, *args):
    ini = time.perf_counter()
    out = fn(*args)
    fin = time.perf_counter()
    return out, fin - ini

🧪 Aprende probando

Ejemplo Ejemplo: detectar función lenta en un flujo Identifica coste dominante para orientar optimización al punto correcto.

🏁 Retos

Reto Reto: inicia medición de tiempo correctamente Sustituye inicialización incorrecta por medición real con reloj de alta resolución.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre Python.

Test de Python

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .