Ускорить скомпилированную программу на Python? - PullRequest
3 голосов
/ 07 февраля 2012

У меня довольно «тяжелая» программа на python, которую я хотел бы скомпилировать в exe.

Программа имеет приличный объем импорта, но с использованием инфраструктуры PyQT4 я загружаю этот импорт, пока отображается заставка.
Я компилирую эту программу в один файл .exe, используя pyinstaller (в cmd):

python %pycompile_file% --onefile --noconsole --icon=Icon.ico Script.pyw

Однако, несмотря на то, что заставка настроена на показ, в то время как импортируется значительное количество модулей (особенно включая sympy), и даже если она показывается мгновенно и в течение адекватного периода времени при запуске через python;
Запуск созданного .exe приводит к серьезной задержке перед отображением заставки, которая отображается только в течение очень короткого времени перед загрузкой всей программы.

Мое подозрение заключается в том, что компиляция из .pyw в .exe ускорила фактический «код» (а значит, и заставку короче), но замедляет фактическое «начало» выполнения программы.

Как я могу это исправить, чтобы .exe не запускался так медленно?

(Я подозреваю, что компиляция в --onefile вносит большой вклад, но мне нужно, чтобы файл .exe был одной папкой вверх по сравнению со всеми .dll, и я не могу понять, как заставить pyinstaller сделать это)

Спасибо!


Windows 7
питон 2.7.2
pyinstaller
PyQt4

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Pyinstaller не превращает код Python в собственный код, он просто упаковывает байт-код Python и интерпретатор байт-кода в один файл - как только накладные расходы при запуске исчезнут, фактическая обработка будет происходить с одинаковой скоростью.

Режим --onefile в Pyinstaller замедлит запуск вашего приложения, поскольку ему необходимо распаковать все библиотеки во временный каталог, прежде чем он сможет их загрузить. В случае PyQT эти библиотеки довольно велики, поэтому задержка будет заметна. Использование режима одного каталога, чтобы библиотеки DLL не распаковывались, должно быть намного быстрее.

0 голосов
/ 08 февраля 2012

решаемые;

Не архивируйте DLL-файлы в скомпилированный .exe.
Сохраняйте все файлы, импортированные кодом (с которым вы хотите, чтобы Пользователь взаимодействовал без навигации по .dll), на один уровень вверх, исоздать ярлык для .exe, который имеет рабочий каталог выше .exe.

Вы можете создать такой ярлык, используя pywin32.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...