La aplicación creada con PyInstaller tiene un inicio lento

Tengo una aplicación escrita en Python y ‘comstackda’ con PyInstaller. También utiliza PyQt para el marco de GUI.

La ejecución de esta aplicación tiene un retraso de unos 10 segundos antes de que se cargue la ventana principal y se muestra. Por lo que puedo decir, esto no se debe a la lentitud de mi código. En cambio, sospecho que esto se debe a la inicialización del tiempo de ejecución de Python.

El problema es que esta aplicación se inicia con una aplicación de laucncher / barra de tareas personalizada. El usuario hará clic en el botón para iniciar la aplicación, verá que nada parece suceder y haga clic en otra aplicación. Cuando mi aplicación muestra su ventana, no puede aparecer en primer plano debido a las reglas de SetForegroundWindow.

Tengo acceso a la fuente del cargador PyInstaller win32, el código Python e incluso el código del iniciador.

Mis preguntas son:

  • ¿Cómo puedo hacer que esta aplicación se inicie más rápido?

  • ¿Cómo puedo medir el tiempo que dedico a los primeros segundos de la vida útil del proceso?

  • ¿Cuál es la técnica generalmente aceptada para reducir el tiempo hasta que se muestra la primera ventana?

Me gustaría evitar agregar una pantalla de bienvenida por dos razones: una, espero que no ayude (la sobrecarga es antes de que se ejecute el código de Python) y dos, simplemente no me gustan las pantallas de bienvenida 🙂

Si lo necesito, probablemente podría editar el apéndice del cargador PyInstaller para crear una ventana, pero esa es otra ruta que preferiría no tomar.

He ‘comstackdo’ algunas aplicaciones wxPython usando py2exe y cx_Freeze, ninguna de ellas tarda más de 4 segundos en iniciarse.

  • ¿Estás seguro de que no es tu código? ¿Quizás alguna red o alguna llamada de recursos de E / S que contenga su aplicación?
  • ¿Has probado otra máquina que no sea la tuya? Incluso el hardware más rápido puede ser lento a veces con la configuración de software, aplicaciones o sistema operativo incorrectos, inténtelo.
  • Intenta sincronizarlo con el módulo timeit.

Nunca usé pyQT, pero con wxPython la velocidad de inicio está bien, y después de la primera inicialización, si cierro y vuelvo a abrir, es más rápido que la primera vez.

Dígale a PyInstaller que cree un ejecutable en modo consola. Esto le da una consola de trabajo que puede utilizar para la depuración.

En la parte superior de la secuencia de comandos principal, incluso antes de que se ejecute la primera importación, agregue una impresión “Inicio del Código Python”. A continuación, ejecute su ejecutable empaquetado desde la línea de comandos. De esta manera, puede obtener una imagen clara si el tiempo se invierte en el cargador de arranque de PyInstaller o en su aplicación.

El gestor de arranque de PyInstaller suele ser bastante rápido en el modo de un solo directorio, pero puede ser mucho más lento en el modo de un solo archivo, porque almacena todo en un directorio temporal. En Windows, la E / S es muy lenta, y luego tiene los antivirus que querrá volver a comprobar todos los archivos DLL.

PyQt en sí no es un problema. PyQt es generado por SIP que genera enlaces perezosos muy rápidos; importar todo el PyQt es más rápido que cualquier otra biblioteca GUI porque básicamente no hace nada: todos los enlaces a clases / funciones se crean dinámicamente cuando (y si!) accedes a ellos, ahorrando también mucha memoria.

Si su aplicación tarda en aparecer, eso también será cierto sin PyInstaller. En ese caso, su única solución es una pantalla de presentación (importe solo PyQt, cree QApplication, cree una pantalla de presentación, luego importe el rest de su progtwig y ejecútelo), o vuelva a trabajar su código. No puedo ayudarte mucho sin detalles.

Sospecho que está utilizando el modo “un archivo” de pyinstaller: este modo significa que debe descomprimir todas las bibliotecas en un directorio temporal antes de que la aplicación pueda iniciarse. En el caso de Qt, estas bibliotecas son bastante grandes y tardan unos segundos en descomprimirlas. Intente usar el modo “un directorio” y vea si eso ayuda?

Estoy de acuerdo con las respuestas anteriores. Mi progtwig Qt python necesitó aproximadamente 5 segundos para iniciarse en una PC decente al usar el modo onefile. Después de cambiar a –onedir, solo tomó alrededor de un segundo comenzar; casi inmediatamente después de que el usuario haga doble clic en el archivo exe. Pero el inconveniente es que hay muchos archivos en ese directorio que no están tan ordenados.

Para mi aplicación, el largo tiempo de inicio fue causado casi por completo por el sistema antivirus. ¡Al apagarlo, el inicio en mi caso se redujo de 3 minutos a menos de 10 segundos!

Para poner estas medidas en perspectiva: mi aplicación se empaquetó con archivos de datos adicionales (aproximadamente 150 archivos con una carga útil de 250 MB), además de cargar Qt y numpy (¡eso puede depender de Intel MKL, que solo agrega otros 200 MB al paquete!) dependencias Incluso no ayudó mucho que el sistema probado estuviera funcionando con una unidad de estado sólido …

En conclusión: si tiene una aplicación grande con muchas dependencias, ¡el sistema antivirus puede verse muy afectado por el tiempo de inicio!