web-dev-qa-db-ja.com

PyInstallerで作成したアプリの起動が遅い

Python=で記述され、PyInstallerで「コンパイル」されたアプリケーションがあります。また、GUIフレームワークにPyQtを使用しています。

このアプリケーションを実行すると、メインウィンドウが読み込まれて表示されるまでに約10秒の遅延があります。私の知る限り、これは私のコードの遅さによるものではありません。代わりに、これはPythonランタイムの初期化が原因であると考えています。

問題は、このアプリケーションがカスタムlaucncher /タスクバーアプリケーションで起動されることです。ユーザーはボタンをクリックしてアプリを起動し、何も起こらないように見え、別のアプリケーションの別の場所をクリックします。私のアプリケーションがウィンドウであることを示している場合、SetForegroundWindowのルールが原因で、ウィンドウが前面に表示されません。

PyInstaller win32ローダーのソース、Pythonコード、さらにはランチャーコードにさえアクセスできます。

私の質問は:

  • このアプリケーションをより速く起動させるにはどうすればよいですか?

  • プロセスのライフタイムの最初の数秒間に費やした時間をどのように測定できますか?

  • 最初のウィンドウが表示されるまでの時間を短縮するために一般的に受け入れられている手法は何ですか?

2つの理由でスプラッシュスクリーンを追加しないようにしたい-1つは役に立たないと思います(オーバーヘッドはPythonコードの実行前)であり、2つは好きではありません。スプラッシュ画面:)

必要な場合は、おそらくPyInstallerローダースタブを編集してウィンドウを作成することもできますが、これは別の方法です。

36
EB.

Py2exeとcx_Freezeを使用していくつかのwxPythonアプリを「コンパイル」しましたが、どれも起動に4秒以上かかりません。

  • それがあなたのコードではないと本当に確信していますか?おそらく、アプリを保持しているネットワークまたはI/Oリソースの呼び出しですか?
  • 自分以外のマシンを試しましたか?最速のハードウェアでも、ソフトウェア構成、アプリ、OSが間違っていると遅くなることがあります。試してみてください。
  • Timeitモジュールでタイミングを調整してみてください。

私はpyQTを使用したことはありませんが、wxPythonでは起動速度は問題ありません。また、最初の初期化後、再度閉じて開くと、初回よりも高速です。

PyInstallerにコンソールモードの実行ファイルを作成するように伝えます。これにより、デバッグに使用できる作業コンソールが提供されます。

メインスクリプトの上部に、最初のインポートが実行される前であっても、「Pythonコード開始」という印刷を追加します。次に、パッケージ化された実行可能ファイルをコマンドラインから実行します。これにより、PyInstallerのブートローダーまたはアプリケーションのどちらで時間が費やされているかを明確に把握できます。

PyInstallerのブートローダーは通常、1つのディレクトリモードではかなり高速ですが、すべてを一時ディレクトリにデパックするため、1つのファイルモードではかなり遅くなる可能性があります。 Windowsでは、I/Oが非常に遅く、すべてのDLLファイルをダブルチェックする必要があるアンチウイルスが存在します。

PyQt自体は問題ではありません。 PyQtは、SIPによって生成されます。これは非常に高速な遅延バインディングを生成します。PyQt全体のインポートは、基本的に何もしないため、他のGUIライブラリよりも高速です。クラス/関数へのすべてのバインディングは、 if!)あなたはそれらにアクセスし、多くのメモリを節約します。

アプリケーションの起動が遅い場合、PyInstallerなしでも同様です。その場合の唯一の解決策は、スプラッシュスクリーン(PyQtだけをインポートし、QApplicationを作成し、スプラッシュスクリーンを表示して作成し、プログラムの残りをインポートして実行する)か、コードを作り直すことです。詳細がなければ私はあなたを大いに助けることはできません。

28
Giovanni Bajo

Pyinstallerの「1ファイル」モードを使用していると思います。このモードでは、アプリを起動する前に、すべてのライブラリを一時ディレクトリに解凍する必要があります。 Qtの場合、これらのライブラリは非常に大きく、解凍に数秒かかります。 「1つのディレクトリ」モードを使用してみて、それが役立つかどうかを確認してください。

23
Shish

上記の回答に同意します。私のQt python onefileモードを使用している場合、まともなPCでプログラムを起動するには約5秒必要でした。--onedirに変更した後、起動に約1秒しかかかりませんでした。ユーザーの直後exeファイルをダブルクリックしますが、欠点は、そのディレクトリに多くのファイルが存在することです。

5
Russj

私のアプリケーションでは、起動時間が長いのはほぼすべてウイルス対策システムが原因です。それをオフに切り替えると、私の場合の起動が3分から10秒未満に減少しました。

これらの測定値を分析するために:私のアプリケーションは、Qtとnumpyを持ち運ぶことに加えて、追加のデータファイル(約150ファイル、ペイロードが250 MB)にバンドルされていました(Intel MKLに依存する可能性があり、それだけでバンドルにさらに200 MBが追加されます!)依存関係。テストされたシステムがソリッドステートドライブで実行されていることはあまり役に立ちませんでした...

結論:多くの依存関係を持つ大きなアプリケーションがある場合、起動時間はウイルス対策システムの影響を強く受ける可能性があります。

1
normanius

まだ誰かがこの問題を抱えている場合は、共有ドライブではなくローカルでexeを実行して解決しました。これには、起動時間が1分以上から10秒未満までかかりました。

0
user11886589