やりたいこと
pythonプログラムで、
関数ごとでどの程度処理時間がかかっているかを知りたい
利用するモジュール
timeitという便利なモジュールがあるので試してみた
コード例
# !/usr/bin/env python
import time
import timeit
def test_func(inputs, sleep_time=5):
"""
This is a test function
:param inputs:
:param sleep_time:
:return:
"""
print("call func of test_func")
print("inputs = %d" % inputs)
print("sleep_time = %d" % sleep_time)
time.sleep(sleep_time)
def main():
"""
main
:return: None
"""
inputs = 10
results = timeit.repeat("test_func(inputs, sleep_time)", repeat=5, number=1, setup="from __main__ import test_func;inputs,sleep_time=%d, 2" % inputs)
print(results)
if __name__ == "__main__":
main()
python2.7(.13)でもpython3(.6.2)でも上記のコードで動きました。
上記のように第一引数に実行したい関数およびその引数の変数を、
timeit.repeat
は、number
で指定された回数の実行時間をrepeat
回計測します。
上記の場合、test_func
一回の実行時間を5回計測した時結果が
results
に格納されます。
もしnumber
を10に指定した場合は、10回の計測時間の合計を5つ分results
に格納します。(len(results)
は5になるが、results[i]
はtest_func
を10回行った場合の時間になる)
上記を利用して簡単にnumber
回の実行時間のサンプルをrepeat
個取得できるので、max
, min
, average
などが出せる!
プログラムが遅い場合にボトルネックとなっている箇所を探すときなどに使えそう
はまったポイント
最初、timeit.repeat("test_func(inputs, sleep_time)", repeat=5, number=1, setup="from __main__ import test_func)
として実行すると、inputs
なんてグローバル変数知らないぜってエラーが出ました。
上記で引用している公式サイトで、setup
の部分で変数を定義しているので、それを参考にしたらうまいことできた!
globals()
というのを引数に取れるのがpython3.5で追加されたみたいですが、
公式ドキュメント見てもいまいち効果がわからなかったが、とりあえず、
上記のコードで動くので、気にしないでおこう