お探しの回答とは少し違うかもしれませんが、Pythonのプログラムの処理時間を計測する手段として、プロファイラを使う方法があります。
この場合、計測のために特別なコードを書く必要はないのでコードはまったく煩雑になりません。ただし計測したい単位で関数を分けておく必要があります。
python
1import cProfile
2
3def func1():
4 _a = 0
5 for _ in range(int(1e7)):
6 _a += 1
7
8def func2():
9 _a = 0
10 for _ in range(int(1e8)):
11 _a += 1
12
13def test(n):
14 for i in range(n):
15 func1()
16 func2()
17
18# test(10)を実行して各関数の処理時間を計測
19cProfile.run('test(10)')
これを実行すると、test(10)
を実行して、内部の各関数が何回呼び出されて、それぞれの関数でどれくらい時間がかかったかなどを集計して表示してくれます。
以下、実行例です。
24 function calls in 30.303 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 30.303 30.303 <string>:1(<module>)
1 0.000 0.000 30.303 30.303 test.py:12(test)
10 2.736 0.274 2.736 0.274 test.py:2(func1)
10 27.567 2.757 27.567 2.757 test.py:7(func2)
1 0.000 0.000 30.303 30.303 {built-in method builtins.exec}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
最初の行は内部で24回の関数が実行されて 30.303 秒かかったことを示しています。その下の表は各関数の実行回数(ncalls
)や、1回当たりにかかった秒数(percall
)、その関数のソースと行数と関数名(filename:lineno(function)
)などが表示されます。
func1()
は0.274秒、func2()
は2.757秒くらいかかっていることがわかります。
詳細については公式のドキュメントをご参照ください。
https://docs.python.org/ja/3/library/profile.html
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。