L'application créée avec PyInstaller a un démarrage lent
J'ai une application écrite en Python et 'compilée' avec PyInstaller. Il utilise également PyQt pour le framework GUI.
L'exécution de cette application a un délai d'environ 10 secondes avant le chargement de la fenêtre principale et est affichée. Pour autant que je sache, ce n'est pas dû à la lenteur de mon code. Au lieu de cela, je soupçonne que cela est dû à L'initialisation de l'exécution Python.
Le problème est que cette application est démarrée avec une application laucncher / taskbar personnalisée. L'utilisateur va cliquer sur le bouton pour lancer l'application, voir rien ne semble se produire, et cliquez ailleurs sur une autre application. Lorsque mon application montre sa fenêtre, elle ne peut pas venir au premier plan en raison des règles de SetForegroundWindow.
J'ai accès à la source du chargeur Win32 PyInstaller, au code Python et même au Code du lanceur.
Mes questions sont:
Comment puis-je faire démarrer cette application plus rapidement?
Comment puis-je mesurer le temps passé i le premier quelques 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 soit affichée?
Je voudrais éviter d'ajouter un écran de démarrage pour deux raisons-Une, Je m'attends à ce que cela n'aide pas (la surcharge est avant L'exécution du code Python) et deux, je n'aime pas les écrans de démarrage:)
Si j'en ai besoin, je pourrais probablement éditer le talon du chargeur PyInstaller pour créer une fenêtre, mais c'est une autre route que je préfère ne pas prendre.
5 réponses
J'ai 'compilé' quelques applications wxPython utilisant py2exe et cx_Freeze, aucune d'entre elles ne prend plus de 4 secondes pour démarrer.
- Êtes-vous sûr que ce n'est pas votre code ? peut-être un réseau ou un appel de ressources d'E/S contenant votre application ?
- Avez-vous essayé une autre machine que la vôtre? Même le matériel le plus rapide peut être lent parfois avec la mauvaise configuration de logiciel, applications ou système d'exploitation, essayez-le.
- Essayez de le chronométrer avec le module timeit.
Je n'ai jamais utilisé pyQT, mais avec wxPython le la vitesse de démarrage est OK, et après la première initialisation si je ferme et ouvre à nouveau, c'est plus rapide que la première fois.
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, avant même l'exécution de la première importation, ajoutez une impression "démarrage du Code Python". Ensuite, exécutez votre exécutable packagé à partir de la ligne de commande. De cette façon, vous pouvez obtenir une image claire si le temps est passé dans le bootloader de PyInstaller ou dans votre application.
Le bootloader de PyInstaller est généralement assez rapide en mode one-dir, mais il peut être beaucoup plus lent en mode un fichier, car il dépacks tout dans un répertoire temporaire. Sous Windows, les e / s sont très lentes, et vous avez des antivirus qui voudront vérifier tous ces fichiers DLL.
PyQt lui-même est un non-problème. PyQt est généré par SIP qui génère des liaisons paresseuses très rapides; l'importation de L'ensemble de PyQt est plus rapide que toute autre bibliothèque graphique car elle ne fait rien: toutes les liaisons aux classes/fonctions sont créées dynamiquement quand (et si!) vous y accédez, économisant beaucoup de mémoire aussi.
Si votre application est lente à venir, cela sera également vrai sans PyInstaller. Dans ce cas, votre seule solution est soit un écran de démarrage (importer juste PyQt, créer QApplication, créer un affichage de l'écran de démarrage, puis importer le reste de votre programme et l'exécuter), ou retravailler votre code. Je ne peux pas vous aider sans détails.
Je soupçonne que vous utilisez le mode "one file" 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 grandes et prennent quelques secondes pour décompresser. Essayez d'utiliser le mode "un répertoire" et voyez si cela aide?
Je suis d'accord avec les réponses ci-dessus. Mon programme Qt python avait besoin d'environ 5 secondes pour démarrer sur un PC décent lors de l'utilisation du mode onefile. Après avoir changé en --onedir, il n'a fallu qu'une seconde pour démarrer; presque immédiatement après que l'utilisateur double-clique sur le fichier exe. Mais l'inconvénient est qu'il y a beaucoup de fichiers dans ce répertoire qui n'est pas si soigné.
Pour mon application, le long temps de démarrage a presque entièrement été causé par le système antivirus. L'éteindre a réduit le démarrage dans mon cas de 3 minutes à moins de 10secs!
Pour mettre ces mesures en perspective: mon application a été fournie avec des fichiers de données supplémentaires (environ 150 fichiers avec une charge utile de 250 Mo), en plus de transporter Qt et numpy (cela peut dépendre D'Intel MKL, qui à lui seul ajoute un autre 200 Mo au bundle!) dépendance. Cela n'a même pas beaucoup aidé que le le système testé fonctionnait avec un lecteur à état solide...
En conclusion: Si vous avez une grande application avec beaucoup de dépendances, le temps de démarrage peut être fortement affecté par le système antivirus!