11 - Medición de tiempos reales en Python

Medir ejecuciones en Python permite validar la teoría de Big-O y detectar cuellos de botella. A diferencia del análisis asintótico, aquí importan constantes, caché y características del hardware.

11.1 time.perf_counter()

time.perf_counter() entrega un temporizador de alta resolución para medir tiempo de pared.

import time

def medir_perf(fn):
  inicio = time.perf_counter()
  fn()
  fin = time.perf_counter()
  return fin - inicio

Si el algoritmo espera I/O o duerme, sigue siendo útil porque mide tiempo real transcurrido.

11.2 time.time()

time.time() entrega segundos desde la época y sirve para mediciones gruesas.

import time

inicio = time.time()
ejecutar_trabajo()
fin = time.time()
print("Duracion: %.2f s" % (fin - inicio))

La resolución puede variar; para loops cortos conviene perf_counter().

11.3 Crear benchmarks simples

Para reducir ruido:

  • Repite varias veces y promedia.
  • Calienta caches ejecutando una pasada previa.
  • Evita trabajo de E/S dentro del tramo medido.
def benchmark(fn, valores, repeticiones):
  total = 0.0
  for _ in range(repeticiones):
    total += medir_perf(lambda: fn(valores))
  return total / repeticiones

Prepara los datos una vez y evita trabajo extra dentro del tramo medido.

11.4 Comparar tiempos entre algoritmos

Usa las mismas entradas para que la comparación sea justa.

def medir_bubble(valores):  # ...
  return 0.0

def medir_quick(valores):  # ...
  return 0.0

datos = generar(5000)
print("Bubble: %.6f s" % medir_bubble(datos))
datos = generar(5000)
print("Quick: %.6f s" % medir_quick(datos))

Restaura o copia la entrada entre corridas para no medir con datos ya ordenados salvo que sea intencional.

11.5 Variabilidad por hardware

  • CPU, caches y frecuencia turbo alteran el tiempo real sin cambiar Big-O.
  • Otros procesos en el sistema generan ruido; ejecuta en modo aislado o repite varias veces.
  • La memoria y el ancho de banda de disco afectan algoritmos intensivos en E/S.

Reporta la plataforma (CPU, RAM, SO, versión de Python) junto a los resultados para contexto.

11.6 Graficar resultados (exportar a CSV)

Guardar pares n,tiempo permite graficar en hojas de cálculo o Python.

import csv

def escribir_csv(ruta, ns, tiempos):
  with open(ruta, "w", newline="", encoding="utf-8") as archivo:
    writer = csv.writer(archivo)
    writer.writerow(["n", "tiempo_s"])
    for n, t in zip(ns, tiempos):
      writer.writerow([n, "%.6f" % t])

Al graficar, observa si la curva crece lineal, logarítmica o cuadrática; contrasta con el Big-O esperado.