Numba llega al navegador: ejecución JIT de Python científico en JupyterLite

Fuentes: Numba in the Browser: Unlocking a New Scientific Python Stack in JupyterLite

El compilador JIT Numba ya funciona íntegramente dentro del navegador, integrado en JupyterLite y distribuido a través de emscripten-forge. Hasta ahora, los notebooks Jupyter dependían de un servidor con Python; JupyterLite ejecutaba los kernels localmente vía WebAssembly, pero carecía de soporte para Numba, una pieza clave del ecosistema científico por su aceleración de código numérico.

El obstáculo era técnico: Numba depende de llvmlite y LLVM, que en plataformas nativas coloca código generado en memoria ejecutable. El navegador, por seguridad, prohíbe crear o modificar memoria ejecutable de esa forma. Los responsables del proyecto aprovecharon su trabajo previo en Xeus-Cpp para diseñar un motor de ejecución para WebAssembly: compila el LLVM IR a un objeto WebAssembly, lo enlaza con LLD dentro del propio proceso del navegador y lo carga como módulo lateral. Cada función del usuario implica varios módulos que se cargan en orden —runtime de Numba, helpers generados por el compilador y la función final— y resuelven sus símbolos mutuamente.

En pruebas internas, Numba en el navegador alcanza una aceleración de unas 250 veces sobre Python puro frente a las 90 veces en nativo, una ganancia relativa mayor al evitar la sobrecarga del intérprete. Además, se habilitó la caché persistente con @njit(cache=True) para reutilizar compilaciones entre sesiones y se incorporó renderizado de grafos de control de flujo con Graphviz sin lanzar subprocesos. Numba ya está disponible como paquete en emscripten-forge, lo que permite instalarlo en cualquier despliegue de JupyterLite y desbloquea el ecosistema basado en Numba para documentación, educación y demos interactivas sin servidor.