私が理解しているのは、range()実際にはPython 3のオブジェクト型である関数が、ジェネレーターのようにその場でコンテンツを生成することです。
これが事実である場合、1兆が範囲内にあるかどうかを判断するためには、1兆の値を生成する必要があるため、次の行に膨大な時間がかかると予想していました。
1000000000000000 in range(1000000000000001)
さらに、ゼロをいくつ追加しても、計算には多少同じ時間がかかります(基本的には瞬時)。
私もこのようなことを試しましたが、計算はまだほとんど瞬時です:
1000000000000000000000 in range(0,1000000000000000000001,10) # count by tens
私が自分の範囲関数を実装しようとすると、結果はそれほど良くありません!!
def my_crappy_range(N):
i = 0
while i < N:
yield i
i += 1
return
何でrange()それがとても速くなりボンネットの下にやったオブジェクトは?
マルタインピータースの答えは、その完全性のために選ばれた、だけでなく、見たabarnertの最初の答えのためにそれが何を意味するかの良い議論のためのrange本格的なようにシーケンスのPython 3での、およびのための潜在的な矛盾に関するいくつかの情報/警告__contains__のPython実装間の機能の最適化。abarnertの他の回答は、さらに詳細に説明されており、Python 3での最適化の背後にある歴史(およびxrangePython 2 での最適化の欠如)に関心のある人にリンクを提供しています。pokeとwim による回答は、関連するCソースコードと、興味がある人のための説明を提供します。
range発電機だと言ったのですか?
xrangeと同じでrangeはありませんか?
xrange()オブジェクトには__contains__メソッドがないため、アイテムチェックはすべてのアイテムをループする必要があります。さらにrange()、にはスライス(これrangeもオブジェクトを返す)をサポートし、ABC との互換性を保つためのメソッドcountとindexメソッドが追加されているなど、には他にもいくつかの変更がありますcollections.Sequence。
boolまたはlongタイプである場合にのみ当てはまることに注意してください。お試しください:100000000000000.0 in range(1000000000000001)