收集比较是反身的,但不会短路。为什么?

时间:2016-08-05 01:59:21

标签: python

在python中,内置集合将元素与它们是自反的明确假设进行比较:

  

在强制元素的反身性时,集合的比较假定对于集合元素x,x == x始终为真。基于该假设,首先比较元素标识,并且仅针对不同元素执行元素比较。

逻辑上,这意味着对于任何列表LL == L必须为True。鉴于此,为什么实施不会检查身份以使评估短路?

In [1]: x = list(range(10000000))
In [2]: y = list(range(int(len(x)) // 10))
In [3]: z = [1]

# evaluation time likes O(N)
In [4]: %timeit x == x
10 loops, best of 3: 21.8 ms per loop
In [5]: %timeit y == y
100 loops, best of 3: 2.2 ms per loop
In [6]: %timeit z == z
10000000 loops, best of 3: 36.4 ns per loop

显然,子类可以选择进行身份检查,显然身份检查会为每次这样的比较增加一个非常小的开销。

是否明确决定在内置序列中进行此类检查以避免此费用?

1 个答案:

答案 0 :(得分:2)

虽然我不了解开发人员的想法,但我的猜测是他们可能觉得比较L == L经常不足以保证进行特殊检查,而且用户可以随时使用{{ 1}}建立一个 如果他认为有利,那么短路检查自己。

(L is L) or (L==L)