2010-09-24 13 views
10

Napisałem klasę, której implementacja .__hash__() zajmuje dużo czasu. Myślałem o buforowaniu jego skrótu i ​​przechowywaniu go w zmiennej, takiej jak ._hash, więc metoda po prostu zwróci ._hash. (Który zostanie obliczony na końcu .__init__() lub po raz pierwszy .__hash__() jest nazywany.)Python: Czy istnieje jakikolwiek powód * nie * do buforowania skrótu obiektu?

Moje rozumowanie było następujące: "Ten obiekt jest niezmienny -> Jego skrót nigdy się nie zmieni -> Mogę cachować hash."

Ale teraz to mnie zastanowiło: Możesz powiedzieć to samo o dowolnym, miekkim obiekcie, jakim jest. (Z wyjątkiem obiektów którego skrót jest ich identyfikator.)

Więc jest tam kiedykolwiek powód nie buforować hash obiektu, z wyjątkiem drobnych przedmiotów, których obliczenie skrótu jest bardzo szybki?

Odpowiedz

8

Oczywiście, dobrze jest buforować wartość skrótu. W rzeczywistości Python robi to dla samych ciągów. Kompromitacja odbywa się między prędkością obliczania skrótu a ilością miejsca potrzebną do zapisania wartości skrótu. Taki kompromis polega na przykład na tym, że krotki nie buforują wartości mieszania, ale łańcuchy (patrz request for enhancement #1462796).

0

Zwykle powodem jest to, że większość obiektów w Pythonie jest zmienna, więc jeśli wartość mieszania zależy od właściwości, zmienia się w momencie zmiany właściwości. Jeśli twoja klasa naprawdę jest niezmienna i (wszystkie właściwości, które wchodzą w skład skrótu, są również niezmienne!), Możesz buforować hasz.

+5

Oczywiście, jeśli obiekt jest zmienny, zwykle nie jest dobrym pomysłem zaimplementowanie '__hash__' w ogóle. Jedyne wbudowane zastosowania '__hash__' wymagają, aby skrót był stabilny. –

+2

Nie, domyślna implementacja '__hash__' nie zwraca niczego innego po zmianie właściwości obiektu. Ponieważ domyślnie jest to prawdziwe dla dowolnego obiektu: 'hash (obj) == id (obj) == hash (id (obj))' - oznacza to, że obiekty po prostu przyjmują swój identyfikator jako swój skrót. Identyfikator jest statyczny, więc możesz powiedzieć, że obiekty domyślnie buforują swój skrót. –

Powiązane problemy