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.
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.
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().
Para reducir ruido:
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.
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.
Reporta la plataforma (CPU, RAM, SO, versión de Python) junto a los resultados para contexto.
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.