Por qué Python paga un impuesto de importación antes de que se ejecute tu código
Python paga un impuesto de importación antes de que se ejecute tu código. El inicio del intérprete inicia una cadena de importación ansiosa: localiza módulos, compila o carga bytecode y luego ejecuta el código a nivel de módulo. Este proceso se repite a través de todo el grafo de dependencias, cargando cada módulo y sus dependencias.
Esta carga ansiosa tiene un precio. Las aplicaciones con inicio pesado, las herramientas de línea de comandos y las funciones serverless de corta duración sienten el costo de manera más aguda. Pueden terminar antes de usar gran parte de lo que importaron, pagando por un trabajo que nunca contribuye a la ejecución. Un desarrollador principal de Python realizó una prueba comparativa con una pequeña aplicación: 104 ms de inicio con importaciones normales.
La carga perezosa (lazy loading) ofrece una salida. En lugar de una ejecución inmediata, proporciona un marcador de posición. La importación real (encontrar el archivo, compilar bytecode y ejecutar el código a nivel de módulo) solo se activa cuando tu código hace referencia por primera vez al módulo importado. Esto pospone el trabajo hasta que sea necesario.
La prueba comparativa del mismo desarrollador muestra el impacto: ocultar importaciones pesadas dentro de funciones redujo el inicio a 46 ms. Hacer que todas las importaciones fueran perezosas lo redujo aún más a 36 ms, casi 3 veces más rápido que la carga ansiosa. Esta no es una mejora universal del tiempo de ejecución total, sino una optimización de inicio dirigida.
Las importaciones perezosas explícitas, utilizando una nueva palabra clave lazy, evitan romper el código existente que depende de efectos secundarios a nivel de módulo, como el registro de plugins. Esto garantiza una optimización dirigida sin consecuencias no deseadas.
El pequeño cambio de sintaxis detrás de la aceleración
PEP 810 introduce lazy imports explícitas, una solución de sintaxis dirigida. Coloca lazy import <module> en la parte superior de un archivo, al igual que las importaciones regulares, pero difiere la ejecución del módulo hasta que el código acceda por primera vez a un nombre importado. Esto mantiene las dependencias visibles y evita dispersar las declaraciones import por toda la base de código, una solución común para el inicio lento.
La solución alternativa familiar (mover las importaciones dentro de las funciones) oculta las dependencias y desordena el código. lazy import nativo soluciona esto. Ofrece los mismos beneficios de inicio sin sacrificar la legibilidad ni obligar a los desarrolladores a refactorizar las ubicaciones de importación.
Python resuelve la importación diferida en el primer uso. Cuando el código accede a un nombre importado o a un atributo de módulo, el intérprete carga, compila y ejecuta el módulo. Esto significa que la aplicación sigue pagando el costo de importación, pero solo cuando y si esa dependencia específica es realmente necesaria durante el tiempo de ejecución.
Este enfoque dirigido ofrece ganancias significativas. Un desarrollador principal de Python realizó una prueba comparativa con una aplicación: 104 ms con importaciones normales, 46 ms al ocultar importaciones pesadas en funciones y 36 ms con todo en modo perezoso. Eso es una aceleración de casi 3 veces desde la carga ansiosa hasta la carga totalmente perezosa. Se prefiere usar la palabra clave lazy sobre configuraciones globales como PYTHONLAZYIMPORTS porque evita romper el código que registra plugins o ejecuta otros efectos secundarios críticos durante la importación. Marca solo tus importaciones pesadas para obtener el impacto más seguro y mayor.
Un lanzamiento de 104 ms cae a 36 ms, pero eso es solo una aplicación
Un desarrollador principal de Python demostró el impacto de las lazy imports en una pequeña aplicación. El inicio base, utilizando importaciones ansiosas normales, tomó 104 ms. Mover manualmente las importaciones pesadas a las funciones redujo esto a 46 ms. Con lazy imports explícitas, el tiempo de inicio cayó aún más a 36 ms. Esto representa una aceleración de 2.9x sobre la base ansiosa.
Estas cifras ilustran el potencial, pero no son garantías universales. Las mejoras en el rendimiento varían según la aplicación. Pruebe su propio proyecto para confirmar los beneficios. Consulte PEP 810 – Explicit lazy imports para obtener detalles completos de la especificación.
Los lazy imports ofrecen la mayor recompensa para cargas de trabajo dominadas por el inicio. Estas incluyen:
- Interfaces de línea de comandos (CLIs)
- Scripts locales de corta duración
- Invocaciones de funciones Serverless
En estos escenarios, el costo inicial de importación a menudo representa un gran porcentaje del tiempo total de ejecución. Diferir la ejecución del módulo reduce directamente esta sobrecarga. Mida el tiempo de inicio de su aplicación para identificar si los lazy imports pueden ofrecer un impulso de rendimiento similar.
¿Te está gustando? Recibe uno así en tu bandeja cada mañana.
un correo al día · date de baja en dos clics · sin rastreadores de terceros
Por qué hacer que cada importación sea lazy puede ser contraproducente
Los lazy imports globales pueden ser contraproducentes. Algunos módulos registran plugins, hooks u otros comportamientos inmediatamente al importarse; diferirlos significa que la configuración nunca ocurre cuando se espera. El código que depende de estos efectos secundarios fallará.
La sintaxis explícita lazy import, como en PEP 810, evita este peligro. Se dirige a dependencias específicas, pesadas u opcionales para su aplazamiento. Esto difiere de una variable de entorno global o un interruptor de línea de comandos que cambia ampliamente todas las importaciones a lazy.
El fork Cinder de Python de Meta exploró inicialmente la pereza global. La experiencia con Cinder informó el trabajo en PEP 690, que propuso lazy imports globales implícitos pero fue rechazado debido a estas mismas preocupaciones sobre los efectos secundarios.
El enfoque explícito de PEP 810 aborda esas preocupaciones, proporcionando un mecanismo más seguro y controlado. Siempre verifique su versión de Python y el estado específico de la función antes de adoptar lazy import. Ofrece ganancias significativas en el inicio, pero exige una aplicación cuidadosa y dirigida.
Preguntas frecuentes
¿Qué son los lazy imports en Python?
Los lazy imports difieren la carga y ejecución de un módulo importado hasta que el código lo utiliza por primera vez.
¿Cuánto más rápido pueden hacer los lazy imports el inicio de Python?
En un benchmark de una aplicación pequeña reportado, el inicio cayó de 104 ms a 36 ms, aproximadamente 2.9 veces más rápido. Los resultados varían según la aplicación.
¿Cómo se escribe un lazy import?
Utilice la forma explícita lazy import module para diferir esa importación hasta que sea necesaria.
¿Pueden los lazy imports romper las aplicaciones de Python?
Sí. Diferir módulos que registran plugins o realizan otros efectos secundarios en el momento de la importación puede cambiar el comportamiento; el uso explícito y dirigido reduce ese riesgo.

