2016-08-05 32 views
7

在Python中,內置的收藏比較明確的假設,他們是反身元素:收藏比較是自反的,但不會短路。爲什麼?

在加固元件的反身性,藏品比較假定爲集合元素,則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 

顯然,子類可以選擇做一個身份檢查,並明確了身份檢查將增加一個非常小的開銷到每一個這樣的比較。

是否明確作出了一個歷史決定而不是做出這樣的內置序列檢查,以避免這種開支?

回答

2

雖然我並不瞭解開發者的思想,我的猜測是,他們可能會感到比較L == L並不經常發生,足以保證一個特殊的檢查,而且,用戶可以隨時使用(L is L) or (L==L)建立一個 如果他認爲有利,短路檢查自己。

In [128]: %timeit (x is x) or (x == x) 
10000000 loops, best of 3: 36.1 ns per loop 

In [129]: %timeit (y is y) or (y == y) 
10000000 loops, best of 3: 34.8 ns per loop 
+0

我不知道猜測是非常有幫助的。我相信OP也可以猜測。 –

+2

@JohnKugelman:我同意我通常不喜歡發表意見,但OP特意[徵求我的意見](http://stackoverflow.com/questions/38779705/comparison-of-collections-containing-non-reflexive-元件/ 38779764?noredirect = 1個#comment64931217_38779764)。 – unutbu

相關問題