Question

J'ai une application écrite dans Python et "compilée" avec Pyinstaller. Il utilise également Pyqt pour le cadre d'interface graphique.

Exécution de cette application a un délai d'environ 10 secondes avant la charge de la fenêtre principale et est affichée. Pour autant que je sache, cela 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 de Python.

Le problème est que cette application est lancée avec une application personnalisée de Laucrncher / Barre de tâches. L'utilisateur cliquera sur le bouton pour lancer l'application, voir rien ne semble se produire, puis cliquez sur Ailleurs sur une autre application. Lorsque mon application montre sa fenêtre, elle ne peut pas arriver au premier plan en raison des règles de Serforegroundwindow.

J'ai accès à la source pour le chargeur de pyinstaller Win32, le code Python et même le code de lanceur.

Mes questions sont:

  • Comment puis-je faire commencer cette application plus rapidement?

  • Comment puis-je mesurer le temps dépenser je 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 soit affichée?

    J'aimerais éviter d'ajouter un écran éclaboussable pour deux raisons - une personne, je m'attends à ce qu'elle ne vous aide pas (les frais généraux sont avant les points de code Python) et deux, je n'aime pas simplement les écrans Splash :)

    Si j'en ai besoin, je pourrais probablement modifier le talon de la chargeur Pyinstaller pour créer une fenêtre, mais c'est un autre itinéraire que je préfère ne pas prendre.

Était-ce utile?

La solution

J'ai "compilé" quelques applications Wxpython à l'aide de Py2exe et CX_Freeze, aucun d'entre eux ne prend plus de 4 secondes pour commencer.

  • Êtes-vous sûr sûr que ce n'est pas votre code? Peut-être qu'un réseau ou un appel de ressources d'E / S contenant votre application?
  • Avez-vous essayé une autre machine que la tienne?Même le matériel le plus rapide peut être lent parfois avec la mauvaise configuration logicielle, les applications ou le système d'exploitation, essayez-le.
  • essayez de le calmer avec le module TimeiT.

    Je n'ai jamais utilisé Pyqt, mais avec WxPython, la vitesse de démarrage est correcte, et après la première initialisation si je ferme et ouvrez à nouveau, il est plus rapide que la première fois.

Autres conseils

Indiquez à 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 que la première importation est exécutée, ajoutez un «code Python Démarrer». Ensuite, exécutez votre exécutable emballée de la ligne de commande. De cette façon, vous pouvez obtenir une image claire si le temps est passé dans le chargeur de démarrage de Pyinstaller ou dans votre application.

Le chargeur de démarrage de Pyinstaller est généralement assez rapide en mode un-dir, mais il peut être beaucoup plus lent en mode un seul fichier, car il dépasse tout dans un répertoire temporaire. Sous Windows, les E / S sont très lents, puis vous avez des antivirus qui souhaiteront vérifier tous ces fichiers DLL.

Pyqt elle-même est un non-problème. PYQT est généré par SIP qui génère des fixations de paresseux très rapides; L'importation de la pyqt entière est plus rapide que toute autre bibliothèque d'interface graphique car elle ne fait fondamentalement rien: toutes les liaisons aux classes / fonctions sont créées de manière dynamique quand (et si!) Vous y accédez, sauvegarde également beaucoup de mémoire.

Si votre application est lente à venir, cela sera vrai sans pyinstaller aussi. Dans ce cas, votre seule solution est soit un écran SPLASH (importation Just Pyqt, créez Qaplication, créez un affichage de l'écran SplashScreen, puis importer le reste de votre programme et l'exécuter) ou retravaillez votre code. Je ne peux pas vous aider beaucoup sans détails.

Je soupçonne que vous utilisez le mode "One 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 commencer.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 des 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 d'un mode OneFile.Après avoir changé à --onedir, il n'a pris qu'environ une seconde pour commencer;Presque immédiatement après l'utilisateur double clique sur le fichier EXE.Mais l'inconvénient est qu'il existe de nombreux fichiers dans ce répertoire qui n'est pas si propre.

Pour ma demande, la longue heure de démarrage a presque entièrement été causée par le système antivirus.Désactiver le démarrage dans mon cas de 3 minutes à moins de 10 secondes!

Pour apporter ces mesures dans la 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 (pouvant dépendre de Intel MKL, qui ajoute à elle seule 200 Mo à laBundle!) Dépendances.Il n'a même pas beaucoup aidé que le système testé fonctionnait avec un lecteur d'état solide ...

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

Si quiconque a toujours eu ce problème, j'ai résolu la mine en exécutant l'EXE localement et non sur des SharedRives.Cela a pris le temps de démarrage de plus d'une minute à moins de 10 secondes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top