プログラミング/python の履歴(No.2)

更新


公開メモ

プロファイリング

python は普通に書くと思った以上に遅いことになる場合が多いので、 プロファイリングの結果を基に重い処理を numpy 側に移したりするのが役に立つ

いろいろ試した結果、特に並列処理を使ったバッチ処理が走るライブラリを使う場合には jupyter 上でのプロファイリングするとライブラリ関数の実行中に UI スレッドが動いて プロファイル結果が無茶苦茶になるようです。

したがって面倒でもプロファイルは Jupyter 外で行った方が間違いない。

前処理結果を dump する

jupyter 上で計算した結果を引き継ぎつつ jupyter 外で処理を回すには、前処理で得られたデータ(プロファイリングしたい処理への入力)を pickle.dump しておき、外部で動かす処理ではそれを呼んで動作を行う

Jupyter セル内で実行

LANG:python
import pickle
payload = {
    "param1": param1,
    "param2": param2,
    "param3": param3,
}
with open("payload.pkl", "wb") as f:
    pickle.dump(payload, f, protocol=pickle.HIGHEST?PROTOCOL)

で(通常の python データであれば)書き出せる

読み込んで動かす .py ファイル

do_profile.py

LANG:python
import pickle
import cProfile
import pstats

from my_module import func_to_profile

def main():
    with open("payload.pkl", "rb") as f:
        payload = pickle.load(f)

    prof = cProfile.Profile()
    prof.enable()
    refined = func_to_profile(**payload)
    prof.disable()

    prof.dump_stats("prof.out")

if __name__ == "__main__":
    main()

実行する

LANG:console
$ python do_profile.py
$ python -m pstats prof.out

Counter: 108 (from 2010/06/03), today: 9, yesterday: 4