ホームページ  >  記事  >  バックエンド開発  >  Python の高速ループメソッドをいくつ知っていますか?

Python の高速ループメソッドをいくつ知っていますか?

WBOY
WBOY転載
2023-04-13 09:13:061806ブラウズ

皆さんこんにちは、somenzz です。今日は Python の最速ループ手法を勉強します。

さまざまな姿勢

たとえば、1 から 1 億まで貯めるという単純なタスクがあります。これは、次の 7 つの方法で達成できます。

1. while ループ

def while_loop(n=100_000_000):
i = 0
s = 0
while i < n:
s += i
i += 1
return s

2. for ループ

def for_loop(n=100_000_000):
s = 0
for i in range(n):
s += i
return s

3. 合計範囲

def sum_range(n=100_000_000):
return sum(range(n))

4. 合計ジェネレーター

def sum_generator(n=100_000_000):
return sum(i for i in range(n))

5. 合計list comprehension (リスト内包表記)

def sum_list_comp(n=100_000_000):
return sum([i for i in range(n)])

6, sum numpy

import numpy
def sum_numpy(n=100_000_000):
return numpy.sum(numpy.arange(n, dtype=numpy.int64))

7, sum numpy python range

import numpy
def sum_numpy_python_range(n=100_000_000):
return numpy.sum(range(n))

上記 7 つの方法で得られる結果は同じですが、所要時間は異なります。どの方法が最も速いかを推測し、次のコードの実行結果を確認してください:

import timeit

def main():
l_align = 25
print(f'{"1、while 循环":<{l_align}} {timeit.timeit(while_loop, number=1):.6f}')
print(f"{'2、for 循环':<{l_align}}{timeit.timeit(for_loop, number=1):.6f}")
print(f'{"3、sum range":<{l_align}} {timeit.timeit(sum_range, number=1):.6f}')
print(f'{"4、sum generator":<{l_align}} {timeit.timeit(sum_generator, number=1):.6f}')
print(f'{"5、sum list comprehension":<{l_align}} {timeit.timeit(sum_list_comp, number=1):.6f}')
print(f'{"6、sum numpy":<{l_align}} {timeit.timeit(sum_numpy, number=1):.6f}')
print(f'{"7、sum numpy python range":<{l_align}} {timeit.timeit(sum_numpy_python_range, number=1):.6f}')

if __name__ == '__main__':
main()

実行結果は次のとおりです:

Python の高速ループメソッドをいくつ知っていますか?

while より速い方法

for ブロック

for と while は本質的に同じことをしていますが、while は純粋な Python コードであり、for は C 拡張機能を呼び出してインクリメントしますバインド チェック変数を使用すると、CPython インタプリタは C 言語で記述されており、Python コードは C コードよりも遅く、for ループは C を表し、while ループは Python を表すため、for は while よりも高速であることがわかります。

numpy の組み込み sum は Python の sum よりも高速です

numpy は主に C で書かれています。同じ関数であれば、numpy の方が確実に高速です。同様に、numpy の arange は Python よりも確実に高速です。速い。

クロス使用は遅くなります

Numpy の合計は Python の範囲と組み合わせて使用​​され、結果が最長になります。方法 7 を参照してください。タスクを完了するには、方法 6 のように numpy パッケージを使用するのが最善です。

ジェネレーターはリスト内包表記より高速です

ジェネレーターは遅延しており、一度に 1 億個の数値を生成しませんが、リスト内包表記はすべての数値を一度に割り当てるため、占有メモリが少なくなります。これを超えるとキャッシュを有効に利用できないため、パフォーマンスが若干低下します。

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

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