Python: есть ли причина * не * кэшировать хеш объекта? - PullRequest
11 голосов
/ 24 сентября 2010

Я написал класс, реализация которого .__hash__() занимает много времени.Я думал кешировать его хэш и сохранить его в переменной типа ._hash, чтобы метод .__hash__() просто возвращал ._hash.(Который будет вычислен либо в конце .__init__(), либо при первом вызове .__hash__().)

Я рассуждал так: «Этот объект неизменен -> его хэш никогда не изменится -> Iможет кэшировать хеш. "

Но теперь это заставило меня задуматься: то же самое можно сказать о любом хешируемом объекте.(За исключением объектов, чей хэш является их идентификатором.)

Так есть ли когда-нибудь причина , а не для кэширования хеша объекта, за исключением небольших объектов, чье вычисление очень быстро выполняется?1017 *

Ответы [ 2 ]

9 голосов
/ 24 сентября 2010

Конечно, нормально кешировать значение хеша. Фактически, Python делает это для самих строк. Компромисс находится между скоростью вычисления хеша и пространством, которое требуется для сохранения значения хеша. Это компромисс, например, почему кортежи не кэшируют свои значения хеша, а строки делают (см. запрос на улучшение # 1462796 ).

0 голосов
/ 24 сентября 2010

Обычная причина в том, что большинство объектов в Python являются изменяемыми, поэтому, если хеш зависит от свойств, он изменяется, как только вы изменяете свойство. Если ваш класс действительно неизменяемый и (все свойства, входящие в хеш, тоже неизменны!), То вы можете кэшировать хеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...