A comparação da coleção é reflexiva, mas não provoca curto-circuito. Por quê?
Em python, as coleções incorporadas comparam elementos com a suposição explícita de que eles são reflexivos:
Ao reforçar a reflexividade dos elementos,a comparação de coleções assume que, para um elemento de coleção x, x == x é sempre verdadeiro. Com base nessa premissa, a identidade do elemento é comparada primeiro e a comparação de elementos é realizada apenas para elementos distintos.
Logicamente, isso significa que, para qualquer listaL
, L == L
devemos serTrue
. Diante disso, por que a implementação não verifica a identidade para causar um curto-circuito na avaliação?
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
Claramente, as classes filhas poderiam optar por fazer uma verificação de identidade, e claramente uma verificação de identidade acrescentaria uma sobrecarga muito pequena a cada comparação.
Foi uma decisão histórica explicitamente tomadanão fazer tal verificação nas seqüências incorporadas para evitar essa despesa?