10
Python 3で「1000000000000000 in range(1000000000000001)」が非常に高速なのはなぜですか?
私が理解しているのは、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ソースコードと、興味がある人のための説明を提供します。