为什么 max() 和 min() 不能有效地处理 Python 3 中的范围对象?
Why don't max() and min() work efficiently for range objects in Python 3?
正如 所解释的那样,Python 3 中的 range
个对象足够聪明,能够有效地测试成员资格:
In [1]: 1000000000000000 in range(1000000000000001)
Out[1]: True # answer returned very quickly
然而,用max
和min
对range
的最大值和最小值求值时情况并非如此,这似乎遍历了整个序列以找到这些值:
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)
正如 range
个对象足够聪明,能够有效地测试成员资格:
In [1]: 1000000000000000 in range(1000000000000001)
Out[1]: True # answer returned very quickly
然而,用max
和min
对range
的最大值和最小值求值时情况并非如此,这似乎遍历了整个序列以找到这些值:
In [2]: max(range(1000000000000001)) # don't do this
...
为range
对象有效地实现这些功能是微不足道的,那么为什么没有实现呢?是否缺少一些实施细节或边缘情况?
max
接受给定的序列,不对类型做任何假设。无论它是 range
对象、列表还是生成器,都会在 O(n) 时间内简单地迭代序列。
其他一些运算符和函数遵循 dunder 方法,然后计算结果。在 range
的情况下,in
调用 __contains__
dunder 方法,然后计算是否 low <= item < high
,基本上。所以它是 python3.