0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[python] for文while文どちらが処理が速い?

Posted at

結論

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つが理由として挙げらます。

  1. range()がC言語レベルで実装されているため、イテレーションが効率的
  2. while文はPython側で条件判定・変数更新を都度行うため、オーバーヘッドが大きい
  3. for文は内部的イテレータを使っており、インクリメントや条件判定の最適化が自動で行われる

そのため、ループ回数が多い場合ほど差が大きくなります。

まとめ

今回の検証から、Pythonにおいて単純な繰り返し処理を行う場合は、for文の方がwhile文よりも高速であることが明らかになりました。特に、range() 関数がC言語で最適化されていることが大きな要因です。一方で、while文は条件を自由に設定できる柔軟性がありますが、その分、毎回の条件判定や変数の更新処理がPythonレベルで実行されるため時間がかかります。したがって、パフォーマンスを重視する場面ではfor文を使用するのが望ましいと言えます。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?