我有一个类(我们称之为myClass
),它实现了__hash__
和__eq__
。我也有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)查找时间
@MartijnPieters:我只是在包括他们之前不小心打了救,他们现在在那里。 – BrenBarn
奇妙的例子! – inspectorG4dget
Python在其哈希表中不使用桶:它使用包含单个值的每个插槽的插槽。如果某个插槽已满,则会选择另一个插槽等,直到找到匹配或未使用的插槽。 – Duncan