Ho una classe (chiamiamola myClass
) che implementa sia __hash__
e __eq__
. Ho anche un dict
che mappa gli oggetti myClass
con un certo valore, calcolo che richiede del tempo.Cosa succede quando si chiama `if digit in dict`
Nel corso del mio programma, molti (nell'ordine di milioni) myClass
oggetti sono istanziati. Questo è il motivo per cui utilizzo lo dict
per tenere traccia di questi valori.
Tuttavia, a volte un nuovo oggetto myClass
potrebbe essere equivalente a uno più vecchio (come definito dal metodo __eq__
). Quindi, piuttosto che calcolare nuovamente il valore per quell'oggetto, preferirei semplicemente cercare il valore dell'oggetto myClass
precedente nello dict
. Per fare questo, lo faccio if myNewMyClassObj in dict
.
ecco la mia domanda:
Quando uso che in
clausola, ciò che viene chiamato, __hash__
o __eq__
? Il punto di utilizzo di un dict
è che è O (1) tempo di ricerca. Quindi è necessario chiamare __hash__
. Ma cosa succede se __hash__
e __eq__
non sono metodi equivalenti? In tal caso, riceverò un falso positivo per if myNewMyClassObj in dict
?
Follow up domanda:
voglio ridurre al minimo il numero di voci nella mia dict
, quindi vorrei idealmente come mantenere solo uno di una serie di equivalenti myClass
oggetti nel dict
. Così ancora una volta, sembra che __eq__
deve essere chiamato nel calcolo if myNewClassObj in dict
, che contaminano l'O dict
s'(1) Occhiata tempo per un O (n) Occhiata tempo
@MartijnPieters: Ho colpito per errore solo prima di includerli, sono lì ora. – BrenBarn
Fantastici esempi! – inspectorG4dget
Python non usa bucket nelle sue tabelle hash: utilizza slot con ogni slot contenente un singolo valore. Se uno slot è pieno, sceglierà un altro slot e così via finché non troverà una corrispondenza o uno slot inutilizzato. – Duncan