結論
Pythonでは、同じ回数のループを回す場合、for文の方がwhile文より処理速度が速い。 その理由は、for がC言語で最適化された range() オブジェクトを利用しており、Pythonレベルでの条件判定や変数更新が少ないためです。
for文とwhile文の処理速度を比較するコード①
ソースコード
import time
# ループ回数を設定
N = 10_000_000
# for文の計測
start_for = time.time()
for i in range(N):
pass
end_for = time.time()
# while文の計測
start_while = time.time()
i = 0
while i < N:
i += 1
end_while = time.time()
# 結果表示
print("for文の処理時間:", end_for - start_for, "秒")
print("while文の処理時間:", end_while - start_while, "秒")
結果
for文の処理時間: 1.0659637451171875 秒
while文の処理時間: 2.324551582336426 秒
この結果から、for のほうが約2倍速いことが分かります。
for文とwhile文の処理速度を比較するコード②
ソースコード
import timeit
# ループ回数
N = 10_000_000
# for文のテストコード
for_code = f"""
for i in range({N}):
pass
"""
# while文のテストコード
while_code = f"""
i = 0
while i < {N}:
i += 1
"""
# 各コードを10回ずつ実行して平均をとる
for_time = timeit.timeit(stmt=for_code, number=10)
while_time = timeit.timeit(stmt=while_code, number=10)
print(f"for文の平均処理時間: {for_time / 10:.6f} 秒")
print(f"while文の平均処理時間: {while_time / 10:.6f} 秒")
結果
for文の平均処理時間: 0.326145 秒
while文の平均処理時間: 1.135919 秒
timeit モジュールを使っても、for文のほうが3倍以上速い結果となりました。
なぜfor文の方が処理速度が速いか
以下の3つが理由として挙げらます。
- range()がC言語レベルで実装されているため、イテレーションが効率的
- while文はPython側で条件判定・変数更新を都度行うため、オーバーヘッドが大きい
- for文は内部的イテレータを使っており、インクリメントや条件判定の最適化が自動で行われる
そのため、ループ回数が多い場合ほど差が大きくなります。
まとめ
今回の検証から、Pythonにおいて単純な繰り返し処理を行う場合は、for文の方がwhile文よりも高速であることが明らかになりました。特に、range() 関数がC言語で最適化されていることが大きな要因です。一方で、while文は条件を自由に設定できる柔軟性がありますが、その分、毎回の条件判定や変数の更新処理がPythonレベルで実行されるため時間がかかります。したがって、パフォーマンスを重視する場面ではfor文を使用するのが望ましいと言えます。