こんにちは、なりかくんです。
今回は、ふと気になったPythonで再帰関数とループ(while文)の処理速度とメモリについて検証しましたので紹介します。
結果
まず最初に結果からお見せします。
今回は、10回計測してその平均から考察します。
再帰関数の場合は、メモリ消費量平均が23.12461MiBで処理時間平均が0.45662msでした。
ループ文の場合は、メモリ消費量平均が22.40977MiBで処理時間平均が0.27803msでした。
このことからループ(while文)のほうが処理速度とメモリ消費量が優れているということが分かります。
なお今回利用したメモリ消費量と時間計測については、メモリはmemory_profiler、時間はline_profilerを利用しました。
次に検証に使ったコードと検証結果の一部をお見せします。
再帰関数の場合
コードは、以下のようになっています。まず、main関数を呼び出し、sumを定義したのち再帰関数に突入させます。ifで500以上になれば結果をmainに返すという形です。
def main():
sum = 0
sum = tasu(sum)
print(sum)
def tasu(sum):
sum = sum + 1
if sum >= 500:
return sum
else:
return tasu(sum)
時間結果は、以下の通りです。
Total time: 0.0004278 s
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 def main():
4 1 9.0 9.0 0.2 sum = 0
5 1 3422.0 3422.0 80.0 sum = tasu(sum)
6 1 847.0 847.0 19.8 print(sum)
メモリ消費量は、以下の通りです。
Line # Mem usage Increment Occurrences Line Contents
=============================================================
3 22.4570 MiB 22.4570 MiB 1 @profile(precision=4)
4 def main():
5 22.4570 MiB 0.0000 MiB 1 sum = 0
6 23.1797 MiB 0.7227 MiB 1 sum = tasu(sum)
7 23.1836 MiB 0.0039 MiB 1 print(sum)
ループ(while文)の場合
コードは、以下の通りです。こちらは単純にsumを定義したのちwhile文にて500以上になるまでループするという形にしています。ifなどの条件をそろえるために今回はwhile文を利用しています。
def main():
sum = 0
while True:
sum = sum + 1
if sum >= 500:
break
print(sum)
時間結果は、以下の通りです。
Total time: 0.0002893 s
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 def main():
4 1 8.0 8.0 0.3 sum = 0
5 while True:
6 500 793.0 1.6 27.4 sum = sum + 1
7 500 814.0 1.6 28.1 if sum >= 500:
8 1 2.0 2.0 0.1 break
9 1 1276.0 1276.0 44.1 print(sum)
メモリ消費量は以下の通りです。
Line # Mem usage Increment Occurrences Line Contents
=============================================================
3 22.3477 MiB 22.3477 MiB 1 @profile(precision=4)
4 def main():
5 22.3477 MiB 0.0000 MiB 1 sum = 0
6 while True:
7 22.3477 MiB 0.0000 MiB 500 sum = sum + 1
8 22.3477 MiB 0.0000 MiB 500 if sum >= 500:
9 22.3477 MiB 0.0000 MiB 1 break
10 22.3555 MiB 0.0078 MiB 1 print(sum)
以上、検証結果をご紹介しました。
コメント