社内の開発アシスタントが、Pythonのスタートアップ高速化に関する調査を行ないました。
そこから得た知見を、外部に共有したいと思います。
スクリプトのスタートアップ時間が長いときは、import に時間がかかっている場合があります。
そのような場合はまず、Python 3.7 以降で利用できる -X importtime オプションを使ってどの import が時間を消費しているのか調べると良いです。
使用例
$ python -X importtime your/script.py
上記のようにpythonを実行すると、以下のようなログが表示されます。
import time: self [us] | cumulative | imported package
...
import time: 86500 | 179327 | pkg_resources
...
import time: 385 | 236655 | IPython
import time: 22 | 236677 | IPython.core
import time: 26 | 236703 | IPython.core.magic
import time: 978 | 237680 | dotenv.ipython
import time: 199 | 239032 | dotenv
...
...
import time: 3246 | 578972 | pipenv.cli
import time: 507 | 579479 | pipenv
さらにかっこよく可視化するには
tuna というソフトウェアで、importの時間を可視化できます。
以下のようにして、インストールと利用が可能です。
$ pip install tuna
$ python -X importtime your/script.py 2> a.log && tuna a.log
tunaを実行すると、以下のような画面が描画されます。
- ● import 全体にかかっている処理時間が 0.179秒
- ● 内訳は以下の通り
- – awscli.clidriver の importに 0.113秒
- – awscli.handlers の importに 0.051秒
- – …
これにより、import 処理のうちどこで時間がかかっているかを分析し、対処することができるようになります。
解決した例
弊社の従業員が開発している annofab-cli というツールがあります。これは、弊社が開発している AnnoFab への「タスクの一括差し戻し」や、「プロジェクト間の差分表示」など、AnnoFabの画面で実施するには時間がかかる操作を、コマンドとして提供しているものです。
このツールの開発で、ヘルプコマンドが出力されるまでの時間を短くしたいというIssueがありました。
このIssueの解決のため、弊社の開発アシスタントがPythonのスタートアップ高速化に関する調査と対応を行ないました。
調査の結果、annofabcli.statistics.histogram モジュールのimportに時間がかかっていることがわかりました。
結果、以下のようにして ヘルプ表示までの時間を半分にすることができました。
- ● 変更前: 該当するPythonスクリプトの先頭で from annofabcli.statistics.histogram import Histogram していた
- ● 変更後: Histogram を使いたい箇所で、importlib を使って annofabcli.statistics.histogramを遅延ロードする
弊社の開発アシスタント職では、このように 社内の問題ごとや困りごとの調査・解決を行ないます。
興味を持たれた方は、ぜひ採用ページをご覧ください。よろしくお願いいたします。