myClassと の両方を実装するクラス ( と呼びましょう) が__hash__あり__eq__ます。また、オブジェクトを何らかの値にdictマップする もありmyClass、計算には時間がかかります。
私のプログラムの過程で、多くの (数百万のオーダー)myClassオブジェクトがインスタンス化されます。これがdict、これらの値を追跡するために を使用する理由です。
ただし、新しいmyClassオブジェクトが古いオブジェクトと同等である場合があります (__eq__メソッドで定義されているように)。そのため、そのオブジェクトの値を再度計算するのではなくmyClass、dict. これを達成するために、私はしますif myNewMyClassObj in dict。
これが私の質問です:
そのin句を使用すると、何が呼び出されますか、__hash__または__eq__? a を使用するポイントは、dictO(1) ルックアップ時間であることです。したがって、__hash__呼び出される必要があります。しかし、__hash__と__eq__が同等のメソッドではない場合はどうなるでしょうか? その場合、偽陽性になりif myNewMyClassObj in dictますか?
フォローアップの質問:
のエントリの数を最小限に抑えたいdictので、理想的には、一連の同等のmyClassオブジェクトの 1 つだけをdict. 繰り返しますが、 を__eq__計算するときに を呼び出す必要があるようです。これにより、 aの O(1) ルックアップ時間が O(n) ルックアップ時間にif myNewClassObj in dict汚されます。dict