Windows: медленный запуск приложения
У меня есть приложение, написанное на Python и скомпилированное с PyInstaller. Он также использует PyQt для инфраструктуры графического интерфейса.
Запуск этого приложения имеет задержку около 10 секунд до того, как основное окно загрузится и будет показано. Насколько я могу судить, это не из-за медлительности моего кода. Вместо этого я подозреваю, что это связано с инициализацией среды исполнения Python.
Проблема заключается в том, что это приложение запускается с помощью приложения laucncher/taskbar. Пользователь запустит эту кнопку, чтобы запустить приложение, увидеть, как ничего не происходит, и щелкнуть в другом месте в другом приложении. Когда мое приложение показывает это окно, оно не может выходить на передний план из-за правил для SetForegroundWindow.
У меня есть доступ к источнику для загрузчика win32 PyInstaller, кода Python и даже кода запуска.
Мои вопросы:
-
Как запустить приложение быстрее?
-
Как я могу измерить время, затрачиваемое на первые несколько секунд жизни процесса?
-
Какова общепринятая методика сокращения времени до отображения первого окна?
Я бы не хотел добавлять всплеск по двум причинам: один, я думаю, что это не поможет (накладные расходы до запуска кода Python) и два, мне просто не нравятся заставки:)
Если мне нужно, я мог бы, вероятно, отредактировать заглушку загрузчика PyInstaller, чтобы создать окно, но этот другой маршрут я бы скорее не взял.
Спасибо за предложения.
Ответы
Ответ 1
У меня есть "скомпилированные" несколько приложений wxPython с использованием py2exe и cx_Freeze, ни один из них не займет больше 4 секунд.
- Вы уверены, что это не ваш код?
может быть, какая-то сеть или какой-то вызов ресурса ввода-вывода удерживают ваше приложение?
- Вы пробовали другую машину, чем ваша? Даже самое быстрое аппаратное обеспечение иногда может быть медленным с неправильной конфигурацией программного обеспечения, приложениями или ОС, попробуйте.
- Попробуйте синхронизировать его с модулем timeit.
Я никогда не использовал pyQT, но с wxPython скорость запуска в порядке, и после первой инициализации, если я снова закрываю и открываю, это происходит быстрее, чем в первый раз.
Ответ 2
Сообщите PyInstaller создать исполняемый файл в режиме консоли. Это дает вам рабочую консоль, которую вы можете использовать для отладки.
В верхней части основного script, даже до запуска первого импорта, добавьте печать "Начало кода Python". Затем запустите пакетный исполняемый файл из командной строки. Таким образом, вы можете получить четкое представление о том, потрачено ли время на загрузчик PyInstaller или в ваше приложение.
Загрузочный загрузчик PyInstaller обычно довольно быстр в режиме с одним режимом, но он может быть намного медленнее в режиме с одним файлом, потому что он депонирует все во временный каталог. В Windows I/O работает очень медленно, а затем у вас есть антивирусы, которые захотят дважды проверить все эти DLL файлы.
PyQt сам по себе не является проблемой. PyQt генерируется SIP, который генерирует очень быстрые ленивые привязки; Импорт всего PyQt быстрее, чем любая другая графическая библиотека, потому что в основном ничего не делает: все привязки к классам/функциям динамически создаются, когда (и если!) вы получаете к ним доступ, экономя много памяти.
Если ваше приложение работает медленно, это будет верно и без PyInstaller. В этом случае единственным решением будет либо заставка (импортировать только PyQt, создать QApplication, создать экран заставки, затем импортировать остальную часть вашей программы и запустить его), либо переработать код. Я не могу вам помочь без подробностей.
Ответ 3
Я подозреваю, что вы используете режим pyinstaller "один файл" - этот режим означает, что он должен распаковать все библиотеки во временную директорию, прежде чем приложение сможет запустить. В случае Qt эти библиотеки достаточно велики и занимают несколько секунд для распаковки. Попробуйте использовать режим "один каталог" и посмотрите, помогает ли это?
Ответ 4
Я согласен с приведенными выше ответами. Программе Qt python понадобилось около 5 секунд для запуска на приличном ПК при использовании режима одного файла. После того, как я перейду на --oneir, для начала потребуется всего одна секунда; почти сразу после того, как пользователь дважды нажимает на exe файл. Но недостатком является то, что в этом каталоге есть много файлов, которые не так аккуратны.