Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección
Alejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícula, teniendo en cuenta los retiros parciales. La fórmula funciona correctamente, pero tarda entre 1 y 5 minutos en procesar los datos completos. El corazón de la fórmula es un REDUCE que acumula filas con APILARV en cada iteración:
``
x;REDUCE(
{"Matr";"Fecha";"Días";"Saldo";"Retiro"};
_matralm;
LAMBDA(a;v;APILARV(a;LET(
...cálculos por matrícula...
APH(a;b;c;TOM(d;;-1))
)))
)
`
La fórmula original usa AGRUPARPOR, BUSCARX, ELEGIRCOLS, EXPANDIR, EXCLUIR, FILTRAR y varias funciones más dentro de cada paso del REDUCE, con alias de funciones para acortar la expresión (FIL para FILTRAR, ELE para ELEGIRCOLS, etc.).
Leo identifica inmediatamente el cuello de botella: el acumulador del REDUCE crece con cada paso, y en cada iteración tiene que trabajar con todos los datos acumulados hasta ese momento. Esto hace que el rendimiento se degrade exponencialmente con el número de matrículas.
La solución que propone Leo es sustituir el REDUCE + APILARV por una LAMBDA recursiva con bisección. En lugar de acumular fila a fila (complejidad O(n²)), la técnica divide el array por la mitad en cada paso y combina los resultados recursivamente (complejidad O(n·log n)):
`
F;LAMBDA(F;v;LET(
n;FILAS(v);
SI(n=1;
LET(
...mismo cálculo por matrícula individual...
APH(a;b;c;TOM(d;;-1))
);
APILARV(
F(F;TOMAR(v;n/2));
F(F;EXCLUIR(v;n/2))
)
)
));x;APILARV(
{"Matr";"Fecha";"Días";"Saldo";"Retiro"};
F(F;_matralm)
)
`
El patrón clave es F(F;TOMAR(v;n/2)) y F(F;EXCLUIR(v;n/2)): la LAMBDA se llama a sí misma con cada mitad del array. Cuando queda un solo elemento (n=1), ejecuta el cálculo real. Los resultados parciales se van apilando con APILARV al subir por la recursión.
Leo entrega la fórmula optimizada aproximadamente una hora después, trabajando "a ciegas" sin tener acceso al fichero original. La comunidad bautiza la técnica como "Biseccionator".
Esta técnica de bisección es aplicable a cualquier fórmula donde REDUCE + APILARV` se use para construir un resultado fila a fila, y la mejora de rendimiento es tanto más notable cuanto mayor sea el conjunto de datos.
Más contenido de Excel en InflueXcel
- Reto de Excel: El cumpleaños de Bilbo 🎂 | CONTAR.SI y SUMAR.SI desde cero (Nivel 1) TutorialEn La Comarca se celebra el cumpleaños número 111 de Bilbo Bolsón: cerveza, pasteles, fuegos artificiales… y algún curioso escondido tras el
- ¡Excel PowerQuery Hack! Conexiones con rutas relativas en 10 minutos! Tutorial¿Harto de ajustar las conexiones en PowerQuery cada vez que compartes tu archivo de Excel? 🙄 Convierte las conexiones de PowerQuery con ruta
- Mejora un 90% el rendimiento de Power Query con SQLite TutorialPower Query es una herramienta potente para consolidar, combinar y calcular datos, pero cuando trabajamos con millones de registros y calcul
- Nueva Función IMPORTTEXT TutorialNueva función IMPORTTEXT en Excel!! https://techcommunity.microsoft.com/blog/microsoft365insiderblog/bring-data-into-excel-with-the-new-impo
- ¿Columnas con nombres distintos en Power Query? Tutorial¿Columnas con nombres distintos en Power Query? Aquí tienes la solución definitiva para normalizar tus datos y evitar errores al combinar fi
- BUSCARX con valor devuelto dinámico: elige la columna con un botón o un segmentador CasoUna integrante de la comunidad planteó un reto muy habitual al trabajar con tablas de varias columnas: tiene una lista de municipios con cua
- Saldo acumulado por mes: tres enfoques (REDUCE+BYROW, PIVOTARPOR+acumulado, MMULT) CasoJuan plantea una pregunta que parece sencilla y se acaba convirtiendo en tres clases magistrales sobre cómo recorrer una matriz mes a mes. T
- Mapa de España con burbujas: ubicar variables por provincia usando coordenadas X/Y CasoEsta semana surgió una duda muy visual en el grupo: cómo mostrar dos variables por provincia en un mapa de España — una pintada en intensida
- Regularización trimestral con AGRUPARPOR y ARCHIVOMAKEARRAY: del caos a una fórmula CasoCaso fresquito de la comunidad. Juan plantea un problema contable: tiene una tabla de movimientos (Nombre, Cuenta, Importe, Fecha) y necesit
- Grado de avance por proyecto: despivotar y volver a pivotar por fecha CasoNuevo caso de la comunidad con mucho jugo para los que trabajan con reporting de proyectos. Juan plantea un problema habitual en oficinas té