正如this popular question解释的那样,Python 3中的range
对象足够聪明,能够有效地测试成员资格:
In [1]: 1000000000000000 in range(1000000000000001)
Out[1]: True # answer returned very quickly
然而,使用range
和max
评估min
的最大值和最小值时也是如此,这似乎遍及整个序列以找到这些值:
In [2]: max(range(1000000000000001)) # don't do this
...
为range
对象有效地实现这些函数是微不足道的,为什么还没有完成呢?是否有一些我遗漏的实现细节或边缘情况?
max
采用给定的序列,不做任何关于类型的假设。无论是range
对象,列表还是生成器,都可以在O(n)时间内简单地迭代序列。
其他一些运算符和函数遵循dunder方法,然后计算结果。在range
的情况下,in
称__contains__
dunder方法,然后基本上计算是否low <= item < high
。所以在python3中它是O(1)。