在python中,内置集合将元素与它们是自反的明确假设进行比较:
在强制元素的反身性时,集合的比较假定对于集合元素x,x == x始终为真。基于该假设,首先比较元素标识,并且仅针对不同元素执行元素比较。
逻辑上,这意味着对于任何列表L
,L == 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
显然,子类可以选择进行身份检查,显然身份检查会为每次这样的比较增加一个非常小的开销。
是否明确决定不在内置序列中进行此类检查以避免此费用?
答案 0 :(得分:2)
虽然我不了解开发人员的想法,但我的猜测是他们可能觉得比较L == L
经常不足以保证进行特殊检查,而且用户可以随时使用{{ 1}}建立一个
如果他认为有利,那么短路检查自己。
(L is L) or (L==L)