私が理解しているのは、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での最適化の背後にある歴史(およびxrange
Python 2 での最適化の欠如)に関心のある人にリンクを提供しています。pokeとwim による回答は、関連するCソースコードと、興味がある人のための説明を提供します。
range
発電機だと言ったのですか?
xrange
と同じでrange
はありませんか?
xrange()
オブジェクトには__contains__
メソッドがないため、アイテムチェックはすべてのアイテムをループする必要があります。さらにrange()
、にはスライス(これrange
もオブジェクトを返す)をサポートし、ABC との互換性を保つためのメソッドcount
とindex
メソッドが追加されているなど、には他にもいくつかの変更がありますcollections.Sequence
。
bool
またはlong
タイプである場合にのみ当てはまることに注意してください。お試しください:100000000000000.0 in range(1000000000000001)