Python 3で「範囲内の1000000000000000(1000000000000001)」が非常に高速なのはなぜですか?

| | |

range()関数は、実際には Python 3のオブジェクトタイプは、ジェネレーターと同様に、そのコンテンツをその場で生成します。

この場合、次の行を期待していました。 1兆が範囲内にあるかどうかを判断するには、1兆の値を生成する必要があるため、非常に時間がかかります。

  1000000000000000 in range(1000000000000001) 

さらに:ゼロをいくつ追加しても、計算にはほぼ同じ時間がかかるようです(基本的には瞬間的です)。

私もこのようなことを試しました、ただし、計算はほぼ瞬時に行われます。

  1000000000000000000000 in range(0,1000000000000000000001,10)#数十でカウント 

実装しようとすると独自の範囲関数、結果はそれほど良くありません!!

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

range()オブジェクトは、内部で何をしているので、非常に高速になっていますか?


Martijn Pieters "の回答が完全性のために選択されましたが、abarnertの最初の回答rangeが本格的なシーケンス Python 3で、Python実装間での __ contains __関数の最適化に関する潜在的な不整合に関する情報/警告。 abarnertのその他の回答では、Python 3の最適化の背後にある歴史に関心のある人のために、さらに詳細なリンクを提供しています( Pythonでのxrangeの最適化の欠如2)。ポークによると by wim は、関心のある人に関連するCソースコードと説明を提供します。