社内の開発アシスタントが、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を遅延ロードする

 

弊社の開発アシスタント職では、このように 社内の問題ごとや困りごとの調査・解決を行ないます。
興味を持たれた方は、ぜひ採用ページをご覧ください。よろしくお願いいたします。

カテゴリー: ブログ