Ich habe eine Klasse geschrieben, deren Implementierung .__hash__()
lange dauert. Ich habe darüber nachgedacht, seinen Hash zu cachen und ihn in einer Variablen wie ._hash
zu speichern, so dass die .__hash__()
Methode einfach ._hash
zurückgeben würde. (Was wird entweder am Ende der .__init__()
oder das erste Mal .__hash__()
genannt wird.)Python: Gibt es einen Grund * nicht * den Hash eines Objekts zu cachen?
Meine Argumentation war: "Dieses Objekt ist unveränderlich -> Sein Hash wird sich nie ändern -> Ich kann den Hash Cache."
Aber jetzt hat mich das denken: Sie können das gleiche über jeder hashable Objekt sagen. (Mit Ausnahme von Objekten, deren Hash ihre ID ist.)
Also gibt es jemals einen Grund nicht den Hash eines Objekts zu cachen, außer für kleine Objekte, deren Hash-Berechnung sehr schnell ist?
Wenn ein Objekt veränderbar ist, ist es natürlich eine schlechte Idee, "__hash__" überhaupt zu implementieren. Die einzigen eingebauten Verwendungen von '__hash__' erfordern, dass der Hash stabil ist. –
Nein, die Standardimplementierung von '__hash__' gibt nichts anderes zurück, wenn Sie eine Eigenschaft für ein Objekt ändern. Weil das standardmäßig für jedes Objekt gilt: 'hash (obj) == id (obj) == hash (id (obj))' - das bedeutet, dass Objekte ihre ID als Hash nehmen. Die ID ist statisch. Sie können also sagen, dass Objekte ihren Hash standardmäßig "zwischenspeichern". –