es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La importación inicial de módulos de Python es lenta en una nueva VM, ¿incluso después de calentar __pycache__?

Tengo una imagen de Amazon Linux que uso para algunas tareas de aprendizaje automático (ML), que utilizan mucho Python. Cuando inicio una nueva máquina, la primera vez que importo todos los paquetes de Python (numpy, scipy, scikit-learn, xarray, etc.) lleva mucho tiempo, aproximadamente 80 segundos si importo absolutamente todo. Las importaciones subsiguientes, incluso en procesos de Python separados en la misma máquina virtual, son extremadamente rápidas: 1-2 segundos para todo.

Me gustaría eliminar esos más de 60 segundos en el inicio si pudiera; solo pago el costo de rendimiento una vez por máquina virtual, pero las máquinas virtuales tienen una vida corta (generalmente para un trabajo, tal vez 45-60 minutos).

Mi suposición original era que esto estaba relacionado con __pycache__; que el minuto la primera vez se estaba compilando y almacenando en caché el bytecode de todas las bibliotecas, y las ejecuciones posteriores eran más rápidas porque todo eso ya se había terminado. Entonces agregué un script a mi constructor de imágenes, que importaba cada módulo al que alguna vez hago referencia como parte de la creación de la imagen. Sin embargo, los resultados no fueron todos los que esperaba y no hubo ganancia de rendimiento:

  1. Ejecutar el script como parte del constructor de imágenes es casi instantáneo (no esperaba esto).
  2. Ejecutar el script crea los archivos __pycache__ esperados junto a sus fuentes en site-packages.
  3. Los archivos __pycache__ existen en los sistemas creados a partir de la imagen, antes de que se haya ejecutado Python.
  4. Ejecutar el script en un sistema recién creado a partir de la imagen todavía lleva más de un minuto, aunque los archivos __pycache__ ya están en su lugar.
  5. Ejecutar el script en el mismo sistema por segunda vez toma menos de un segundo.
  6. <module>.__cached__ en el sistema creado a partir de la imagen parece hacer referencia al archivo .pyc correcto en la carpeta __pycache__ correcta que estaba en su lugar desde la imagen.
  7. Las fechas de todos los archivos .pyc en las carpetas __pycache__ reflejan el momento de la creación de la imagen, no de la instanciación de la máquina virtual.

Entonces parece que aunque mi script de “importar todo” sí crea archivos __pycache__, en realidad no tiene ningún impacto en el tiempo de inicio en un sistema creado a partir de una imagen con esos archivos. ¿Hay algo más que se persista entre sesiones de Python en la misma máquina aparte de los archivos .pyc? ¿Hay alguna caché diferente de archivos .pyc que se esté comprobando, aparte de la almacenada en site-packages?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es posible que durante el inicio de Python se esté consultando otra caché que está causando el retraso. Una posibilidad podría ser la caché de sys.path, que guarda las rutas de los módulos importados. Es posible que esta caché no se esté guardando en la imagen de la máquina y se esté recreando cada vez que se inicia una nueva VM, lo que causa el retraso.

    Una solución a este problema podría ser escribir manualmente el contenido de la caché de sys.path en un archivo durante el proceso de creación de la imagen, y luego cargar este archivo de caché durante el inicio. Esto permitiría que las rutas de los módulos importados ya estén en caché, reduciendo el tiempo de inicio.

    Otra posibilidad es utilizar una herramienta como pyinstaller para crear un único archivo ejecutable que incluya todos los módulos y dependencias necesarios. Esto eliminaría la necesidad de que Python importe los módulos por separado, reduciendo significativamente el tiempo de inicio.

    En general, es importante identificar la causa raíz del retraso durante el inicio y encontrar una solución adecuada que se ajuste al caso de uso específico.

Comments are closed.