CPython 3.15 introduce un perfilado de intérprete de sobrecarga mínima para su JIT

Fuentes: Python 3.15’s Ultra-Low Overhead Interpreter Profiling Mode

CPython 3.15 incorpora un nuevo modo de perfilado del intérprete, diseñado expresamente para alimentar el compilador JIT que debutará en esa versión. La técnica se articula en torno al intercambio dinámico de tablas de despacho: en lugar de duplicar el intérprete o de introducir ramas condicionales en el código caliente, se mantienen dos tablas y una variable local selecciona cuál se usa. La tabla de perfilado redirige todas las instrucciones a un único manejador que registra la traza y devuelve el control al bucle principal mediante la tabla normal, lo que evita ramificaciones y mantiene el flujo predecible para la CPU.

Esta arquitectura resuelve un problema concreto del enfoque previo basado en saltos entre dos intérpretes, que penalizaba el intérprete de computed gotos con un 6 % de slowdown en pyperformance al duplicar de forma efectiva el tamaño del binario en C. También supera la opción clásica de activar la lógica de perfilado con un booleano, que se descartó por resultar invasiva y degradar el camino rápido pese a la buena predicción de la rama.

En la prueba del autor, con el escalado dinámico de frecuencia desactivado y la variable PYTHON_JIT_RESUME_INITIAL_VALUE=1, el coste del perfilado ronda 4,5 veces el del intérprete sin profilado (1,72 µs frente a 7,47 µs en la mediana de 40 ejecuciones). El dato contrasta con sistemas de tracing como PyPy, que multiplican por 900-1000 el tiempo de ejecución en meta-tracing. La misma idea puede reutilizarse para perfilar tipos u otras señales en tiempo de ejecución sin reescrituras profundas.