ホームページ >バックエンド開発 >Python チュートリアル >Python 3 の `range()` はどのようにして大きな数値に対するこのような高速なメンバーシップ チェックを実現するのでしょうか?
Python 3 の range(n) の驚くべきパフォーマンス
Python 3 の range ジェネレーター関数は、次の場合にその例外的な速度で知られています。範囲内の多数のメンバーシップをチェックします。この動作は、反復する必要があると思われる膨大な数の整数を考慮すると、一見直観に反しているように見えます。 range オブジェクトはどのようにしてこの驚くべき効率を実現しているのでしょうか?
スマート シーケンス: Python 3 の Range
予想に反して、Python 3 の range オブジェクトは事前に整数の範囲全体を生成します。代わりに、反復中にオンデマンドで数値を計算するスマート シーケンスとして機能します。開始点、終了点、およびステップ サイズのみを保存するため、必要に応じて個々の値または部分範囲を計算できます。
最適化されたにはメソッドが含まれます
範囲オブジェクトは、高度に最適化された contains メソッドも実装します。このメソッドは、シーケンス全体をスキャンせずに、指定された数値が範囲内にあるかどうかを評価します。代わりに、開始点、終了点、ステップ サイズを含む数学的計算が実行されます。この計算は最適化された C コードで実行され、時間計算量はほぼ一定になります。
簡略化された Range オブジェクトの実装例
概念を説明するために、簡略化されたオブジェクトを考えてみましょう。独自の範囲オブジェクトの実装:
class my_range: # ... other methods as described in the question and answer ... def __contains__(self, num): if self.step < 0: if not (self.stop < num <= self.start): return False else: if not (self.start <= num < self.stop): return False return (num - self.start) % self.step == 0
この例は、効率的なオブジェクトの背後にある基本原則を示しています。 には範囲オブジェクトのメソッドが含まれます。範囲全体を反復処理せずに範囲メンバーシップを計算します。
要約すると、Python 3 の range オブジェクトは、オンデマンド計算と最適化された contains メソッドを組み合わせた、慎重に設計されたデータ構造です。この設計により、広範囲にわたる多数の封じ込めチェックを大幅な効率で実行できるようになります。
以上がPython 3 の `range()` はどのようにして大きな数値に対するこのような高速なメンバーシップ チェックを実現するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。