我已經寫了一個類,其實施需要很長時間才能執行。我一直在考慮緩存它的散列,並將其存儲在一個像._hash
這樣的變量中,因此.__hash__()
方法將簡單地返回._hash
。 (這將在.__init__()
的末尾計算或者第一次被調用.__hash__()
。)Python:是否有任何理由*不*緩存對象的散列?
我的推理是:「這個對象是不可變的 - >它的散列值永遠不會改變 - >我可以緩存散列值。
但現在讓我想到:你可以說任何可哈希對象的同樣的事情。 (除了哈希值是它們的ID的對象)
因此,有沒有理由而不是緩存對象的散列,除了散列計算非常快的小對象?
當然,如果一個對象是可變的,那麼實現'__hash__'通常是一個壞主意。 '__hash__'的唯一內建使用要求哈希值穩定。 – 2010-09-24 13:18:39
不,當您更改對象的屬性時,__hash__'的默認實現不會返回任何不同的內容。因爲默認情況下,對於任何對象都是如此:'hash(obj)== id(obj)== hash(id(obj))' - 這意味着對象只需將它們的id作爲它們的哈希值。該ID是靜態的,所以你可以說對象默認「緩存」它們的散列。 – 2010-09-24 13:22:32