为什么max()和min()对于Python 3中的范围对象无法有效工作?

时间:2019-03-05 10:15:33

标签: python-3.x range built-in

正如this popular question所解释的那样,Python 3中的range对象足够聪明,能够有效地测试成员资格:

In [1]: 1000000000000000 in range(1000000000000001)
Out[1]: True    # answer returned very quickly

但是,使用rangemax来评估min的最大值和最小值并非如此,这似乎遍历整个序列以找到它们值:

In [2]: max(range(1000000000000001))   # don't do this
...

range对象有效地实现这些功能是微不足道的,那么为什么还没有完成呢?我缺少一些实现细节或极端情况吗?

1 个答案:

答案 0 :(得分:2)

max按照给定的顺序进行操作,不对类型进行任何假设。不论序列是range对象,列表还是生成器,都可以在O(n)时间内简单地迭代该序列。

其他一些运算符和函数遵循dunder方法,然后计算结果。在range的情况下,in调用__contains__ dunder方法,然后基本计算是否为low <= item < high。因此它是python3中的O(1)。