ホームページ >バックエンド開発 >Python チュートリアル >Python 3 の `range()` はどのようにして大きな数値に対するこのような高速なメンバーシップ チェックを実現するのでしょうか?

Python 3 の `range()` はどのようにして大きな数値に対するこのような高速なメンバーシップ チェックを実現するのでしょうか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-27 13:09:111005ブラウズ

How Does Python 3's `range()` Achieve Such Fast Membership Checking for Large Numbers?

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 サイトの他の関連記事を参照してください。

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