2010-09-24 53 views
10

我已经写了一个类,其实施需要很长时间才能执行。我一直在考虑缓存它的散列,并将其存储在一个像._hash这样的变量中,因此.__hash__()方法将简单地返回._hash。 (这将在.__init__()的末尾计算或者第一次被调用.__hash__()。)Python:是否有任何理由*不*缓存对象的散列?

我的推理是:“这个对象是不可变的 - >它的散列值永远不会改变 - >我可以缓存散列值。

但现在让我想到:你可以说任何可哈希对象的同样的事情。 (除了哈希值是它们的ID的对象)

因此,有没有理由而不是缓存对象的散列,除了散列计算非常快的小对象?

回答

8

当然,可以缓存散列值。事实上,Python本身就是为字符串做的。权衡是在哈希计算的速度和保存哈希值所花费的空间之间进行的。这种权衡是例如为什么元组不会缓存他们的散列值,但字符串做(见request for enhancement #1462796)。

0

通常的原因是Python中的大多数对象都是可变的,所以如果哈希取决于属性,只要更改属性,它就会改变。如果你的类真的是不可变的,并且(所有进入哈希的属性都是不变的!),那么你可以缓存哈希。

+5

当然,如果一个对象是可变的,那么实现'__hash__'通常是一个坏主意。 '__hash__'的唯一内建使用要求哈希值稳定。 – 2010-09-24 13:18:39

+2

不,当您更改对象的属性时,__hash__'的默认实现不会返回任何不同的内容。因为默认情况下,对于任何对象都是如此:'hash(obj)== id(obj)== hash(id(obj))' - 这意味着对象只需将它们的id作为它们的哈希值。该ID是静态的,所以你可以说对象默认“缓存”它们的散列。 – 2010-09-24 13:22:32

相关问题