假设对象a
具有非常昂贵的散列函数,并且我希望在不同的dicts或集合中查询a
。如果我天真地做:
d1_res = d1[a]
d2_res = d2[a]
我要做两次哈希。我希望的是:
编辑:原始问题中的以下代码是错误的!
hashvalue = hash(a)
d1_res = d1.getitem(a, hashvalue=hash)
d2_res = d2.getitem(a, hashvalue=hash)
编辑:这是正确的示例代码
hashvalue = hash(a)
d1_res = d1.getitem(a, hashvalue=hashvalue)
d2_res = d2.getitem(a, hashvalue=hashvalue)
因此我只需要做一个哈希。这有什么办法吗?或者是否存在任何阻止此类界面的基础Python机制?
编辑:以下信息很重要
一个简单的解决方案似乎将哈希结果缓存在__hash__
方法中,但我的示例是简化的。实际上,我的实际情况中的哈希函数并不昂贵(只是int哈希)。但是散列已经进行了很多次,我想减少费用。我正在编写C / C ++扩展,所以我正在寻找任何可能的性能改进。
提前致谢。
这是一个想法,它将使用对象本身(dict键)来保持其哈希值。
dict实现不应该知道 - 它只会调用hash。
每个'setter'都会使缓存的哈希值为None,并强制重新计算。
class MyComplexObject:
def __init__(self, name, size):
self._name = name
self._size = size
self.hash_value = None
def __hash__(self):
if self.hash_value is None:
# heavy calculations goes here
# the result of the calculations is 7 (as an example)
self.hash_value = 7
return self.hash_value
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
self.hash_value = None
@property
def size(self):
return self._size
@size.setter
def size(self, size):
self._size = size
self.hash_value = None