假设对象a
具有非常昂贵的哈希函数,我希望以不同的字典或集合查询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 hash)。但是哈希处理已经执行了很多次,我想削减开支。我正在编写C / C ++扩展,因此我正在寻找可能的性能改进。
谢谢。
答案 0 :(得分:2)
这是一个使用对象本身(dict键)保留其哈希的想法。
不应该知道dict的实现-它只会调用 hash 。
每个“设置者”都会将缓存的哈希值设为“无”,并强制重新计算。
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