我编写了一个类,该类的.__hash__()
实现需要很长时间才能执行。我一直在考虑缓存其哈希,并将其存储在类似._hash
的变量中,因此.__hash__()
方法将仅返回._hash
。 (将在.__init__()
的结尾或首次调用.__hash__()
时进行计算。)
我的推理是:“此对象是不可变的->其哈希永远不会改变->我可以缓存该哈希。”
但是现在让我开始思考:您可以对any可哈希对象说同样的话。 (除了散列为其ID的对象之外。)
因此,除了散列计算速度非常快的小对象之外,是否有理由not来缓存对象的哈希?
当然,可以缓存哈希值。实际上,Python本身就是这样做的。折衷是在哈希计算的速度和保存哈希值所需的空间之间。例如,这种权衡就是为什么元组不缓存其哈希值,而字符串缓存的原因(请参见request for enhancement #1462796)。
通常的原因是Python中的大多数对象都是可变的,因此,如果哈希取决于属性,则更改属性后它就会立即更改。如果您的类确实是不可变的(并且哈希中的所有属性也都是不可变的!),则可以缓存哈希。
hash(obj) == id(obj)
通常不成立:
>>> class A(object): pass
...
>>> a = A()
>>> hash(a), id(a)
(8762051845337, 140192829525392)