質問: 0 while i < n: yield i i += 1 return それをとても速くするフードの下でrange()オブジェクトがしていることは何ですか? martijn pietersの回答 は完全性のために選ばれましたが、 abarnertの最初の回答も参照してください python 3でrangeが本格的なsequenceであることの意味そして、python実装間での__contains__関数最適化の潜在的な矛盾に関する情報/警告。 abarnert's other answer は、もう少し詳しく説明し、python 3での最適化の背後にある歴史(およびpython 2でのxrangeの最適化の欠如)に関心がある人へのリンクを提供します。 answers pokeで and wimで 興味のある人のための適切なcソースコードと説明を提供する。
回答: これはc#の 類似の実装です。 o(1) timeでcontainsがどのように行われたかがわかります。public struct range { private readonly int _start; private readonly int _stop; private readonly int _step; //other methods/properties omitted public bool contains(int number) { // precheck: if the number isnt in valid point, return false // for example, if start is 5 and step is 10, then its impossible that 163 be in range at any interval if ((_start % _step + _step) % _step != (number % _step + _step) % _step) return false; // v is vector: 1 means positive step, -1 means negative step // this value makes final checking formula straightforward. int v = math.abs(_step) / _step; // since we have vector, no need to write if/else to handle both cases: negative and positive step return number * v >= _start * v && number * v < _stop * v; } }