【发布时间】:2012-10-21 20:32:03
【问题描述】:
我有一个实现__hash__ 和__eq__ 的类(我们称之为myClass)。我还有一个 dict 将 myClass 对象映射到某个值,计算需要一些时间。
在我的程序过程中,许多(数百万)myClass 对象被实例化。这就是我使用dict 来跟踪这些值的原因。
但是,有时新的myClass 对象可能等同于旧的对象(由__eq__ 方法定义)。因此,与其再次计算该对象的值,我宁愿在dict 中查找旧的myClass 对象的值。为此,我使用if myNewMyClassObj in dict。
这是我的问题:
当我使用 in 子句时,会调用什么 __hash__ 或 __eq__?使用dict 的意义在于它的查找时间为 O(1)。所以必须调用__hash__。但是如果__hash__ 和__eq__ 不是等效方法怎么办?在这种情况下,if myNewMyClassObj in dict 会误报吗?
跟进问题:
我想尽量减少dict 中的条目数,因此我希望在dict 中只保留一组等效的myClass 对象中的一个。同样,在计算 if myNewClassObj in dict 时似乎需要调用 __eq__,这会将 dict 的 O(1) 查找时间污染为 O(n) 查找时间
【问题讨论】:
标签: python hash dictionary equality