2012-02-27 19 views
18

Mam aplikację napisaną w Pythonie i "skompilowaną" z PyInstaller. Wykorzystuje również PyQt do struktury GUI.Windows: Powolny start aplikacji

Uruchomienie tej aplikacji ma opóźnienie około 10 sekund przed załadowaniem głównego okna i wyświetleniem. O ile wiem, nie wynika to z powolności w moim kodzie. Zamiast tego podejrzewam, że jest to spowodowane uruchomieniem środowiska wykonawczego Python.

Problem polega na tym, że ta aplikacja jest uruchamiana z niestandardową aplikacją laucncher/taskbar. Użytkownik kliknie przycisk, aby uruchomić aplikację. Nic się nie wydarzy i kliknij w innym miejscu w innej aplikacji. Kiedy moja aplikacja pokazuje swoje okno, nie może przejść na pierwszy plan ze względu na reguły SetForegroundWindow.

Mam dostęp do źródła dla programu ładującego win32, kodu Python, a nawet kodu programu uruchamiającego.

Moje pytania są następujące:

  • Jak mogę uruchomić tej aplikacji szybciej?

  • Jak mogę zmierzyć czas spędzony w pierwszych kilku sekundach cyklu życia procesu?

  • Jaka jest ogólnie przyjęta technika zmniejszania czasu do wyświetlenia pierwszego okna?

Chciałbym uniknąć dodawania ekran powitalny z dwóch powodów - jeden, spodziewam się, że nie pomoże (koszt jest przed kod Python działa), a dwa, że ​​po prostu nie lubią ekranów powitalnych :)

Jeśli zajdzie taka potrzeba, prawdopodobnie mógłbym edytować kod programu PyInstaller, aby utworzyć okno, ale to inna droga, której nie powinienem brać.

Dzięki za sugestie.

Odpowiedz

1

Mam "skompilowane" kilka aplikacji wxPython przy użyciu py2exe i cx_Freeze, Żadne z nich nie trwa dłużej niż 4 sekundy, aby rozpocząć.

  • Czy jesteś pewien, że to nie Twój kod? może niektóre sieci lub niektóre wywołania zasobów wejścia/wyjścia trzymające twoją aplikację?
  • Czy próbowałeś innej maszyny niż Twoja? Nawet najszybszy sprzęt może być powolny, czasami z niewłaściwą konfiguracją oprogramowania, aplikacjami lub systemem operacyjnym, spróbuj.
  • Spróbuj ustawić czas za pomocą modułu timeit.

Nigdy nie użyłem pyQT, ale z wxPythonem prędkość uruchamiania jest w porządku, a po pierwszym zainicjowaniu, gdy zamykam i ponownie otwieram, jest to szybciej niż za pierwszym razem.

8

Podejrzewam, że używasz trybu "jeden plik" programu Pyinstaller - ten tryb oznacza, że ​​musi rozpakować wszystkie biblioteki do katalogu tymczasowego, zanim aplikacja zostanie uruchomiona. W przypadku Qt te biblioteki są dość duże i wymagają kilku sekund na rozpakowanie. Spróbuj użyć trybu "jednego katalogu" i sprawdź, czy to pomaga?

10

Poinformuj PyInstaller, aby utworzył plik wykonywalny w trybie konsoli. To daje ci działającą konsolę, której możesz użyć do debugowania.

U góry głównego skryptu, nawet przed uruchomieniem pierwszego importu, dodaj wydruk "Rozpoczęcie kodu Python". Następnie uruchom spakowany plik wykonywalny z wiersza poleceń. W ten sposób można uzyskać wyraźny obraz, czy czas spędzany jest w bootloaderze PyInstaller, czy w aplikacji.

Program ładujący PyInstaller jest zwykle dość szybki w trybie jedno-dirowym, ale może działać znacznie wolniej w trybie jednego pliku, ponieważ wszystko rozkłada się w katalogu tymczasowym. W systemie Windows operacje we/wy są bardzo powolne, a następnie posiadasz oprogramowanie antywirusowe, które będzie chciało dokładnie sprawdzić wszystkie pliki DLL.

Sam PyQt nie jest problemem. PyQt jest generowany przez SIP, który generuje bardzo szybkie lenne wiązania; importowanie całego PyQt jest szybsze niż jakakolwiek inna biblioteka GUI, ponieważ w zasadzie nic nie robi: wszystkie powiązania z klasami/funkcjami są tworzone dynamicznie, kiedy (i jeśli!) masz do nich dostęp, oszczędzając też dużo pamięci.

Jeśli twoja aplikacja będzie powolna, będzie to prawdą również bez PyInstaller. W takim przypadku jedynym rozwiązaniem jest ekran powitalny (zaimportuj tylko PyQt, utwórz QApplication, utwórz ekran powitalny, następnie zaimportuj resztę programu i uruchom go) lub przerób swój kod. Nie mogę ci wiele pomóc bez szczegółów.

+0

Masz rację, stworzyłem prostszą aplikację i rzeczywiście czas uruchomienia stał się niemal natychmiastowy. Używam trybu onedir. Uważam, że problemem jest mój kilka importów. Mam dużo więcej możliwości śledzenia. –

+0

Wow, dzięki za wskazówkę na temat antywirusa. Po wyłączeniu mojego AV, mój exe przyspieszył. – iridescent

1

Zgadzam się z powyższymi odpowiedziami. Mój python program Qt potrzebował około 5 sekund, aby uruchomić na przyzwoitym komputerze PC podczas korzystania z trybu OneFile. Po zmianie na --onedir zajęło mi to tylko około jednej sekundy; prawie natychmiast po dwukrotnym kliknięciu pliku exe. Ale wadą jest to, że istnieje wiele plików w tym katalogu, które nie są tak schludne.

Powiązane problemy