LoginSignup
2
5

More than 5 years have passed since last update.

[python] 標準ライブラリ`timeit`を用いて関数の処理時間を計測する

Posted at

やりたいこと

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で追加されたみたいですが、
公式ドキュメント見てもいまいち効果がわからなかったが、とりあえず、
上記のコードで動くので、気にしないでおこう

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5