Guía 2 - Ejercicio 3: Benchmark DFT
Resolución Ejercicio 3 - Benchmark y Análisis de Complejidad de la DFT
Planteo del Benchmark
El objetivo es empíricamente evaluar el rendimiento de nuestra implementación de la DFT (calcular_dft()) frente al aumento del tamaño de entrada . El enunciado nos pide variar la frecuencia de sampleo Hz. Como mantenemos la duración de la señal en , la cantidad total de muestras escala directamente con la frecuencia de sampleo.
Complejidad Computacional (Big )
Nuestra implementación es matricial:
Donde es una matriz de elementos, y un vector columna de elementos. Analicemos dos tipos de complejidad:
- Complejidad Temporal: Para multiplicar una matriz de por un vector , se requieren del orden de operaciones elementales (sumas y multiplicaciones complejas). Por tanto, la complejidad temporal es .
- Complejidad Espacial: Para generar la matriz de pesos , necesitamos alojar en memoria RAM números complejos de punto flotante de doble precisión (
complex128, 16 bytes cada uno). Por tanto, la complejidad espacial también es .
El colapso del Hardware
Al ejecutar el script de testeo (ejercicio3.py), presenciamos un evento pedagógico brutal: un colapso directo por límite físico (MemoryError).
| (Hz) | Longitud | Tiempo (s) | Memoria Teórica Requerida |
|---|---|---|---|
| 10 | 20 | 0.0001 | 6.4 KB |
| 100 | 200 | 0.003 | 640 KB |
| 1000 | 2000 | 0.28 | 64 MB |
| 10000 | 20000 | FALLA | 6 GB contiguos |
Cuando , la matriz de pesos necesita alojar números complejos. Al pesar 16 bytes cada uno, Numpy le solicita al SO un bloque contiguo de GiB. En una PC de escritorio estándar ejecutando Python en Windows, este intento de asignación contigua falla estrepitosamente arrojando Unable to allocate 5.96 GiB.
Modificamos el script para capturar el MemoryError y continuar graficando los puntos que sí tuvieron éxito.
Análisis Gráfico Log-Log
Para visualizar relaciones de la forma , la técnica estándar es aplicar el logaritmo a ambos lados:
Esto significa que, graficado en ejes Log-Log, deberíamos ver una recta cuya pendiente es precisamente el exponente . Al ajustar linealmente nuestros puntos exitosos (ignorando el primero por ser demasiado rápido y estar dominado por el overhead de Python), el script arrojó una pendiente de . Esto prueba empíricamente nuestro análisis teórico: la implementación matricial escala cuadráticamente con el tamaño del problema.

[!infobox] Ejercicio 3: Rendimiento de la DFT matricial Contexto: Análisis de complejidad temporal y espacial empírica. Resolución Analítica/Numérica: Se midieron los tiempos de ejecución mediante
time.perf_counter(). Se trazó un gráfico Log-Log estimando la pendiente mediante regresión lineal (np.polyfit), confirmando empíricamente que el tiempo crece como . Advertencia/Clave: La implementación naive matricial colapsó por memoria (MemoryError) al llegar a debido a su crecimiento espacial (casi 6GB de RAM requeridos). Este fracaso absoluto demuestra por qué en el mundo real NADIE usa la definición cruda de la Transformada Discreta; se utiliza exclusivamente la FFT (Fast Fourier Transform), que reduce la complejidad temporal a y elimina la matriz gigante reduciendo la espacial a .