誰もが知っているように、Python は効率的な言語ではありません。さらに、ループはどの言語でも非常に時間のかかる操作です。単純な 1 ステップの操作に 1 単位の時間がかかる場合、この操作を何万回も繰り返すと、最終的にかかる時間も何万倍にも増加します。
while と for は、Python でループを実装するためによく使用される 2 つのキーワードですが、実際には、これらの操作効率にはギャップがあります。たとえば、次のテスト コード:
import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s def main(): print('while looptt', timeit.timeit(while_loop, number=1)) print('for looptt', timeit.timeit(for_loop, number=1)) if __name__ == '__main__': main() # => while loop 4.718853999860585 # => for loop 3.211570399813354
これは、1 から n までのすべての自然数の合計を計算する単純な合計演算です。 for ループは while よりも 1.5 秒高速であることがわかります。
主な違いは、この 2 つのメカニズムの違いにあります。
各ループでは、while は実際には for よりも 2 つのステップを実行します: 境界チェックと変数 i のインクリメントです。つまり、ループが実行されるたびに、while は境界チェック (while i < n) と増分計算 (i =1) を実行します。どちらのステップも明示的な純粋な Python コードです。 < n)和自增计算(i +=1)。这两步操作都是显式的纯 Python 代码。
for ループは、境界チェックやインクリメント操作を実行する必要がなく、明示的な Python コードを追加しません (純粋な Python コードは、基礎となる C コードよりも効率が低くなります)。サイクル数が十分に大きい場合、大幅な効率ギャップが現れます。
さらに 2 つの関数を追加し、for ループ内に不要な境界チェックと自動インクリメント計算を追加できます。
import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s def for_loop_with_inc(n=100_000_000): s = 0 for i in range(n): s += i i += 1 return s def for_loop_with_test(n=100_000_000): s = 0 for i in range(n): if i < n: pass s += i return s def main(): print('while looptt', timeit.timeit(while_loop, number=1)) print('for looptt', timeit.timeit(for_loop, number=1)) print('for loop with incrementtt', timeit.timeit(for_loop_with_inc, number=1)) print('for loop with testtt', timeit.timeit(for_loop_with_test, number=1)) if __name__ == '__main__': main() # => while loop 4.718853999860585 # => for loop 3.211570399813354 # => for loop with increment4.602369500091299 # => for loop with test 4.18337869993411
追加された境界チェックと自動インクリメント演算は次のようになります。確かにforループの実行効率に大きく影響します。
前述したように、Python の基礎となるインタプリタと組み込み関数は C 言語で実装されています。 C 言語の実行効率は Python よりもはるかに優れています。
算術シーケンスの合計を求める上記の操作では、Python の組み込み sum 関数を使用すると、for ループや while ループよりも実行効率が大幅に向上します。
import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s def sum_range(n=100_000_000): return sum(range(n)) def main(): print('while looptt', timeit.timeit(while_loop, number=1)) print('for looptt', timeit.timeit(for_loop, number=1)) print('sum rangett', timeit.timeit(sum_range, number=1)) if __name__ == '__main__': main() # => while loop 4.718853999860585 # => for loop 3.211570399813354 # => sum range0.8658821999561042
組み込み関数 sum を使用してループを置き換えた後、コードの実行効率が 2 倍になっていることがわかります。
組み込み関数 sum の累積演算は実際にはループですが、C 言語で実装されています。一方、for ループ内の sum 演算は純粋な Python コード s = i によって実装されています。ド>パイソン。 もう一度考えを広げてください。私たちは皆、子供の頃、ガウスが 1 から 100 までの合計を独創的に計算したという話を聞いて育ってきました。 1…100 の合計は (1 100) * 50 に等しくなります。この計算方法は、上記の合計演算にも適用できます。import timeit def while_loop(n=100_000_000): i = 0 s = 0 while i < n: s += i i += 1 return s def for_loop(n=100_000_000): s = 0 for i in range(n): s += i return s def sum_range(n=100_000_000): return sum(range(n)) def math_sum(n=100_000_000): return (n * (n - 1)) // 2 def main(): print('while looptt', timeit.timeit(while_loop, number=1)) print('for looptt', timeit.timeit(for_loop, number=1)) print('sum rangett', timeit.timeit(sum_range, number=1)) print('math sumtt', timeit.timeit(math_sum, number=1)) if __name__ == '__main__': main() # => while loop 4.718853999860585 # => for loop 3.211570399813354 # => sum range0.8658821999561042 # => math sum 2.400018274784088e-06
以上がどの Python ループメソッドが最も速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。