ホームページ >バックエンド開発 >Python チュートリアル >Python の `range()` オブジェクトはどのようにして非常に大きな範囲のメンバーシップ チェックをほぼ瞬時に行うのでしょうか?

Python の `range()` オブジェクトはどのようにして非常に大きな範囲のメンバーシップ チェックをほぼ瞬時に行うのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-07 22:57:14473ブラウズ

How Does Python's `range()` Object Achieve Near-Instantaneous Membership Checks for Extremely Large Ranges?

Python の Range オブジェクトの驚くべき速度

Python 3 では、 range() 関数は数値の範囲を表すオブジェクトを生成します。このオブジェクトは、範囲全体をメモリ内に作成しないという点で従来のジェネレーターとは異なります。代わりに、オンデマンドで数値を生成するため、大きな範囲の場合は大幅に高速化されます。

問題:

数値が範囲内にあるかどうかを直感的に判断するには、以下を反復する必要があります。その範囲内のすべての値。しかし、Python 3 の range() オブジェクトは、たとえ広大な範囲であっても、そのようなチェックをほぼ瞬時に実行することでこの期待を覆します。

解決策:

range() オブジェクト範囲全体を物理的に保存するわけではありません。むしろ、開始値、終了値、およびステップ値を保持します。メンバーシップをテストする場合、それらの値のみに基づいて結果が計算されます。この計算は C コードで実行され、高い効率に貢献します。

比較:

次の Python コードは、 range() オブジェクトのパフォーマンスを比較します。その場で数値を生成するカスタム実装:

def my_crappy_range(N):
    i = 0
    while i < N:
        yield i
        i += 1

1_000_000_000_000_000 in range(1_000_000_000_000_001)
1_000_000_000_000_000_000_000 in range(1_000_000_000_000_000_000_001)

for number in my_crappy_range(100):
    print(number)

range() オブジェクトはほぼ即座にチェックを実行しますが、カスタム実装には大幅に時間がかかります。

追加の最適化:

range() オブジェクトは、包含テストを最適化する contains フックも実装します。この最適化により、オブジェクトは、範囲のサイズに関係なく、数値が範囲内にあるかどうかをほぼ一定時間で判断できます。

結論:

Python 3 の範囲( ) オブジェクトの並外れた速度は、その効率的なデータ構造と最適化された操作によって実現されます。最小限の情報を保存し、要求された値をオンザフライで計算するため、膨大な範囲であってもほぼ瞬時に封じ込めテストを行うことができます。

以上がPython の `range()` オブジェクトはどのようにして非常に大きな範囲のメンバーシップ チェックをほぼ瞬時に行うのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。