2016-08-05 6 views
7

W python, wbudowany w kolekcjach porównać elementy z wyraźnym założeniu, że są one odruchowy:Porównanie kolekcji jest refleksyjne, ale nie powoduje zwarcia. Czemu?

W egzekwowaniu refleksyjności elementów, porównanie zbiorów zakłada, że ​​do zbierania elementów x, x == x jest zawsze prawdziwe. W oparciu o to założenie, tożsamość elementu jest porównywana w pierwszej kolejności, a porównywanie elementów jest wykonywane tylko dla odrębnych elementów.

Logicznie rzecz biorąc, oznacza to, że dla każdej listy L, L == L musi być True. Biorąc to pod uwagę, dlaczego weryfikacja wdrożenia nie powoduje zwarcia oceny?

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 

Oczywiście, zajęcia dziecko może zdecydować się na sprawdzenie tożsamości i wyraźnie kontrolę tożsamości byłoby dodać bardzo małą napowietrznych do każdego takiego porównania.

Czy decyzja historyczna została jednoznacznie podana , a nie, aby dokonać takiego sprawdzenia w sekwencji wbudowanej, aby uniknąć tego kosztu?

Odpowiedz

2

Choć nie jestem wtajemniczony myślenia deweloperów, domyślam się, że mogą się czuć porównując L == L nie zdarza się często na tyle, aby uzasadnić specjalnej kontroli, a ponadto użytkownik może zawsze korzystać (L is L) or (L==L) zbudować Zwarcie samemu sprawdź, czy uzna to za korzystne.

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

Nie wiem, że zgadywanie jest bardzo pomocne. Jestem pewien, że OP też się domyśla. –

+2

@JohnKugelman: Zgadzam się, że zwykle nie lubię opowiadać, ale OP konkretnie [poprosił o moją opinię] (http://stackoverflow.com/questions/38779705/comparison-of-collections-containing-non-reflexive- elements/38779764? noredirect = 1 # comment64931217_38779764). – unutbu

Powiązane problemy