为何在Python 3中“1000000000000000 in range(1000000000000001)”如此之快?
为何在Python 3中“1000000000000000 in range(1000000000000001)”如此之快?
技术背景
在Python 3里,当我们运用in操作符对range对象开展成员检查时,像1000000000000000 in range(1000000000000001)这种操作的执行速度极快。这和我们常规认知里需要遍历整个序列来判断元素是否存在的情况大不相同。要理解这一现象,就需要了解range对象的特性和其内部实现机制。
classmy_range: def__init__(self, start, stop=None, step=1): if stop isNone: start, stop = 0, start self.start, self.stop, self.step = start, stop, step if step < 0: lo, hi, step = stop, start, -step else: lo, hi = start, stop self.length = 0if lo > hi else ((hi - lo - 1) // step) + 1
def__iter__(self): current = self.start ifself.step < 0: while current > self.stop: yield current current += self.step else: while current < self.stop: yield current current += self.step
def__len__(self): returnself.length
def__getitem__(self, i): if i < 0: i += self.length if0 <= i < self.length: returnself.start + i * self.step raise IndexError('my_range object index out of range')