ホームページ  >  記事  >  バックエンド開発  >  どの Python ループメソッドが最も速いですか?

どの Python ループメソッドが最も速いですか?

WBOY
WBOY転載
2023-04-14 11:07:021366ブラウズ

誰もが知っているように、Python は効率的な言語ではありません。さらに、ループはどの言語でも非常に時間のかかる操作です。単純な 1 ステップの操作に 1 単位の時間がかかる場合、この操作を何万回も繰り返すと、最終的にかかる時間も何万倍にも増加します。

どの Python ループメソッドが最も速いですか?

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

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

数学合計の最終的な実行時間は約 2.4e-6 で、数百万倍も短縮されます。ここでの考え方は、ループの効率が低いため、コードを何億回も実行する必要があるということです。

単純にループを行わず、数式を使用して何億ものループ操作を 1 つのステップに変換します。当然、効率もかつてないほど向上しました。

最終結論 (ちょっとなぞなぞ):

ループを実装する最速の方法——————ループしないことです

Python の場合は、最善を尽くして使用してください。ループ内の純粋な Python コードを最小限に抑えるための組み込み関数。

以上がどの Python ループメソッドが最も速いですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。