覆盖__eq__和__hash__而不降低性能

问题描述 投票:0回答:1

我有两个类别的代表化学结构的结构和片段。如果我比较同一个类的两个实例,则比较应该正常进行,但是如果我比较结构和片段,则比较应该基于唯一标识化学结构的字符串属性。

不幸的是,在我的尝试中,运行时间急剧增加(使用集合和字典的操作。)>

类结构:

def __eq__(self, other):
    if isinstance(other, Structure):
        return self is other
    else:
        return self.cansmiles is other.cansmiles_unstarred

def __hash__(self):
    return hash(self.cansmiles)

Fragment eq

hash用相同的逻辑实现。

“ cansmiles”字符串可能很长(通常为25,最多100),我试图将其切成薄片而没有运气。

问题是:内置hash

eq如此高效的魔术是什么?有没有办法有效地覆盖它们?有什么建议吗?

更新:是否可以避免每次调用__hash__时都计算哈希值?

我有两个类别的代表化学结构的结构和片段。如果我比较同一个类的两个实例,则比较应该正常进行,但是如果我将结构与...

python performance hash overriding equality
1个回答
0
投票

就像评论中提到的那样,您有一个更大的问题:您的代码中有错误。尽管is可能会稍快一些,但它也会做错事。

© www.soinside.com 2019 - 2024. All rights reserved.