Сборник сравнения является рефлексивным, но не имеет короткого замыкания. Зачем?
В 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
Очевидно, что дочерние классы могут выбрать проверку личности, и, очевидно, проверка идентичности добавит очень малые издержки к каждому такому сравнению.
Было ли принято историческое решениене сделать такую проверку во встроенных последовательностях, чтобы избежать этих затрат?