66

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

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

問題は、このアプリケーションがカスタムlaucncher/taskbarアプリケーションで起動されることです。ユーザーはボタンをクリックしてアプリを起動し、何も起こらないように見えることを確認してから、別のアプリケーションの別の場所をクリックします。私のアプリケーションがウィンドウを表示するとき、SetForegroundWindowのルールにより、フォアグラウンドに到達できません。

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

私の質問は次のとおりです。

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

  • プロセスの存続期間の最初の数秒間に費やした時間を測定するにはどうすればよいですか?

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

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

必要に応じて、PyInstallerローダースタブを編集してウィンドウを作成することもできますが、それは私が採用したくない別のルートです。

4

7 に答える 7

62

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

于 2012-02-27T18:42:00.773 に答える
41

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

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

PyInstallerのブートローダーは通常、1ディレクトリモードでは非常に高速ですが、すべてを一時ディレクトリに解凍するため、1ファイルモードでははるかに低速になる可能性があります。Windowsでは、I / Oが非常に遅いため、これらすべてのDLLファイルを再確認するアンチウイルスがあります。

PyQt自体は問題ではありません。PyQtは、非常に高速なレイジーバインディングを生成するSIPによって生成されます。PyQt全体のインポートは、基本的に何も行わないため、他のGUIライブラリよりも高速です。クラス/関数へのすべてのバインディングは、アクセスしたとき(およびアクセスした場合)に動的に作成され、大量のメモリも節約します。

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

于 2012-02-28T00:25:58.893 に答える
11

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

于 2013-04-09T02:14:06.143 に答える
2

私のアプリケーションの場合、起動時間が長いのは、ほぼ完全にウイルス対策システムが原因でした。スイッチをオフにすると、私の場合の起動が3分から10秒未満に短縮されました。

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

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

于 2018-03-18T17:01:20.337 に答える
2

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

于 2019-08-05T21:27:38.477 に答える
1

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

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

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

于 2012-02-27T18:37:32.630 に答える
0

ウイルス対策監視ソフトウェアに例外を追加することでこれを解決しました(F-Secure)。実行する前に数分の待機を削除しました。

于 2021-08-12T15:19:41.927 に答える