Python中有没有办法用已知的哈希值查询dict / set

时间:2019-03-04 08:16:57

标签: python hash

假设对象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 ++扩展,因此我正在寻找可能的性能改进。

谢谢。

1 个答案:

答案 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