Application créée avec PyInstaller a un démarrage lent
J'ai une application écrite en Python et "compilé" avec PyInstaller. Il utilise également PyQt pour la GUI cadre.
L'exécution de cette application dispose d'un délai d'environ 10 secondes avant de la fenêtre principale de charges, et qui est indiquée. Aussi loin que je peux dire, ce n'est pas en raison de la lenteur de mon code. Au lieu de cela, je suppose que c'est en raison de l'exécution Python en cours d'initialisation.
Le problème est que cette application est démarrée avec une coutume laucncher /barre des tâches de l'application. L'utilisateur va cliquer sur le bouton pour lancer l'application, voir rien ne semble se produire, et cliquez ailleurs sur une autre application. Lors de ma demande il montre la fenêtre, il ne peut pas venir au premier plan à cause des règles pour SetForegroundWindow.
J'ai accès à la source de la PyInstaller win32 chargeur, le code Python, et même le lanceur de code.
Mes questions sont:
-
Comment puis-je faire cette demande de démarrer plus rapidement?
-
Comment puis-je mesurer le temps de passer j'ai les premières secondes, le processus de la vie?
-
Ce qui est généralement reconnues de la technique pour la réduction du temps jusqu'à la première ouverture de la fenêtre?
J'aimerais éviter d'ajouter un écran d'accueil pour deux raisons - l'une, j'attends qu'il ne va pas aider (la surcharge est avant Python code s'exécute) et de deux, je n'aime pas les écrans de démarrage 🙂
Si j'en ai besoin, je pourrais probablement modifier la PyInstaller chargeur de stub pour créer une fenêtre, mais c'est une autre route, je préfère ne pas prendre.
- Essayez d'éteindre le système antivirus, il peut avoir un grand effet sur le temps de démarrage. Voir ci-dessous pour plus de détails.
Vous devez vous connecter pour publier un commentaire.
J'ai des "compilé" quelques wxPython applications à l'aide de py2exe et cx_Freeze, Aucun d'entre eux de prendre plus de 4 secondes pour démarrer.
peut-être que certains ou certaines ressources d'e/S appel la tenue de votre application ?
Je n'ai jamais utilisé pyQT, mais avec wxPython la vitesse de démarrage est OK, et après la première initialiser si je fermer et ouvrir à nouveau, il est plus rapide que la première fois.
Dire PyInstaller pour créer une console en mode exécutable. Cela vous donne une console de travail vous pouvez utiliser pour le débogage.
En haut de votre script principal, même avant la première importation est exécuté, ajouter de l'impression d'un "Code Python de départ". Puis exécutez votre package exécutable à partir de la ligne de commande. De cette façon, vous pouvez obtenir une image claire de savoir si le moment est passé dans PyInstaller du chargeur de démarrage ou dans votre application.
PyInstaller du chargeur de démarrage est en général assez rapide dans l'une-dir mode, mais il peut être beaucoup plus lent dans un mode de fichier, car il depacks le tout dans un répertoire temporaire. Sur Windows, I/O est très lent, et puis vous avez l'antivirus qui vous voulez doubler vérifier tous les fichiers DLL.
PyQt lui-même est un non-problème. PyQt est généré par SIP qui génère très rapide paresseux liaisons; l'importation de tout PyQt est plus rapide que tout autre bibliothèque d'interface graphique, car il ne fait rien: toutes les liaisons vers les classes/fonctions sont créées dynamiquement lorsque (et si!) vous y avez accès, de sauver beaucoup de mémoire aussi.
Si votre application est lente à venir, qui sera vrai sans PyInstaller ainsi. Dans ce cas, la seule solution est soit un écran de démarrage (import juste PyQt, créer QApplication, créer un affichage de l'écran d'accueil, puis importer le reste de votre programme et l'exécuter), ou de retravailler votre code. Je ne peux pas beaucoup vous aider sans plus de détails.
Je soupçonne que vous êtes en utilisant pyinstaller "un fichier" mode -- ce mode signifie qu'il a à déballer toutes les bibliothèques dans un répertoire temporaire avant l'application peut commencer. Dans le cas de Qt, ces bibliothèques sont assez grandes et de prendre quelques secondes pour décompresser. Essayez d'utiliser le "répertoire" mode et voir si cela aide?
Je suis d'accord avec les réponses ci-dessus. Mon Qt programme en python besoin d'environ 5 secondes à démarrer sur un PC décent lors de l'utilisation de onfichier mode. Après je change de --onedir, il a seulement pris environ une seconde pour commencer; presque immédiatement après que l'utilisateur double clique sur le fichier exe. Mais l'inconvénient, c'est qu'il y a beaucoup de fichiers dans ce répertoire qui n'est pas si propre.
Pour mon application, le temps de démarrage long presque entièrement été causés par le système antivirus. Éteindre réduit le démarrage dans mon cas, à partir de 3 minutes à moins de 10secs!
De mettre ces mesures en perspective: Ma demande a été livré avec les fichiers de données supplémentaires (environ 150 fichiers avec une charge utile de 250 MO), en plus de réaliser autour de Qt et numpy (qui peut dépendre d'Intel MKL, qui, seule, ajoute un autre de 200 mo pour le forfait!) les dépendances. Il n'a même pas beaucoup d'aide que le système testé est en cours d'exécution avec un lecteur à état solide...
En conclusion: si vous avez une grande application avec de nombreuses dépendances, le temps de démarrage peut être fortement affectée par le système antivirus!
Au cas où quelqu'un est toujours à avoir ce problème, j'ai résolu le mien en exécutant l'exe en local et pas sur n'importe quel sharedrives. Cela a pris le temps de démarrage à partir de plus d'une minute, à moins de 10 secondes.