I've written a class whose .__hash__()
implementation takes a long time to execute. I've been thinking to cache its hash, and store it in a variable like ._hash
so the .__hash__()
method would simply return ._hash
. (Which will be computed either at the end of the .__init__()
or the first time .__hash__()
is called.)
My reasoning was: "This object is immutable -> Its hash will never change -> I can cache the hash."
But now that got me thinking: You can say the same thing about any hashable object. (With the exception of objects whose hash is their id.)
So is there ever a reason not to cache an object's hash, except for small objects whose hash computation is very fast?
Sure, it's fine to cache the hash value. In fact, Python does so for strings itself. The trade-off is between the speed of the hash calculation and the space it takes to save the hash value. That trade-off is for example why tuples don't cache their hash value, but strings do (see request for enhancement #1462796).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With