100 votes

L'application créée avec PyInstaller a un démarrage lent

J'ai une application écrite en Python et 'compilée' avec PyInstaller. Elle utilise également PyQt comme framework GUI.

Lancer cette application a un retard d'environ 10 secondes avant que la fenêtre principale ne se charge et ne s'affiche. Autant que je sache, cela n'est pas dû à la lenteur de mon code. Je soupçonne plutôt que cela est dû à l'initialisation de l'exécution de Python.

Le problème est que cette application est lancée avec un lanceur de tâches personnalisé / de la barre des tâches. L'utilisateur cliquera sur le bouton pour lancer l'application, ne verra rien se passer, puis cliquera ailleurs sur une autre application. Lorsque ma fenêtre d'application s'affiche, elle ne peut pas passer au premier plan en raison des règles pour SetForegroundWindow.

J'ai accès au code source du chargeur win32 de PyInstaller, du code Python, et même du code du lanceur.

Mes questions sont:

  • Comment puis-je faire démarrer cette application plus rapidement ?

  • Comment puis-je mesurer le temps passé dans les premières secondes de la durée de vie du processus ?

  • Quelle est la technique généralement acceptée pour réduire le temps jusqu'à ce que la première fenêtre s'affiche ?

J'aimerais éviter d'ajouter un écran de chargement pour deux raisons - premièrement, je pense que cela ne servira à rien (le surcoût est avant que le code Python ne s'exécute) et deuxièmement, je n'aime tout simplement pas les écrans de chargement :)

Si nécessaire, je pourrais probablement modifier le bouchon de chargeur PyInstaller pour créer une fenêtre, mais c'est une autre voie que je préférerais ne pas emprunter.

91voto

Shish Points 1223

Je soupçonne que vous utilisez le mode "un fichier" de pyinstaller - ce mode signifie qu'il doit décompresser toutes les bibliothèques dans un répertoire temporaire avant que l'application puisse démarrer. Dans le cas de Qt, ces bibliothèques sont assez volumineuses et prennent quelques secondes à se decompresser. Essayez d'utiliser le mode "un répertoire" et voyez si cela aide ?

53voto

Max Points 41

Dites à PyInstaller de créer un exécutable en mode console. Cela vous donne une console de travail que vous pouvez utiliser pour le débogage.

En haut de votre script principal, même avant le premier import, ajoutez un print "Démarrage du code Python". Ensuite, exécutez votre exécutable empaqueté à partir de la ligne de commande. De cette façon, vous pouvez avoir une idée claire si le temps est passé dans le chargeur de PyInstaller ou dans votre application.

Le chargeur de PyInstaller est généralement assez rapide en mode un-dossier, mais il peut être beaucoup plus lent en mode un-fichier, car il décompresse tout dans un dossier temporaire. Sur Windows, l'E/S est très lente, et puis vous avez des antivirus qui voudront vérifier à nouveau tous ces fichiers DLL.

PyQt lui-même n'est pas un problème. PyQt est généré par SIP qui génère des liaisons paresseuses très rapides ; importer tout PyQt est plus rapide que n'importe quelle autre bibliothèque GUI car il ne fait pratiquement rien : toutes les liaisons aux classes/fonctions sont créées dynamiquement quand (et si !) vous y accédez, ce qui économise aussi beaucoup de mémoire.

Si votre application met du temps à démarrer, cela sera vrai également sans PyInstaller. Dans ce cas, votre seule solution est soit un écran de démarrage (importez juste PyQt, créez QApplication, affichez l'écran de démarrage, puis importez le reste de votre programme et exécutez-le), soit retravailler votre code. Je ne peux pas vous aider beaucoup sans détails.

17voto

Russj Points 669

Je suis d'accord avec les réponses ci-dessus. Mon programme Qt python a mis environ 5 secondes pour démarrer sur un PC décent lorsqu'il est utilisé en mode onefile. Après avoir changé en onedir, il a seulement pris environ une seconde pour démarrer; presque immédiatement après que l'utilisateur ait double-cliqué sur le fichier exe. Mais l'inconvénient est qu'il y a de nombreux fichiers dans ce répertoire qui ne sont pas si bien rangés.

4voto

normanius Points 118

Pour mon application, le temps de démarrage long était presque entièrement causé par le système antivirus. Le désactiver a réduit le démarrage dans mon cas de 3 minutes à moins de 10 secondes !

Pour mettre ces mesures en perspective : mon application était accompagnée de fichiers de données supplémentaires (environ 150 fichiers avec une charge utile de 250 Mo), tout en transportant Qt et numpy (qui peuvent dépendre d'Intel MKL, ce qui ajoute encore 200 Mo au bundle !) dépendances. Même le fait que le système testé fonctionnait avec un disque à état solide n'a pas beaucoup aidé...

En conclusion : si vous avez une grande application avec de nombreuses dépendances, le temps de démarrage peut être fortement affecté par le système antivirus !

4voto

user11886589 Points 19

Si quelqu'un rencontre toujours ce problème, j'ai résolu le mien en exécutant le fichier exe localement et non sur des lecteurs partagés. Cela a réduit le temps de démarrage de plus d'une minute à moins de 10 secondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X