Curiosidad sobre __hash__()

Francesc Alted faltet en pytables.org
Mar Feb 10 09:08:26 CET 2009


A Monday 09 February 2009, Jesus Cea escrigué:
> Francesc Alted wrote:
> > Ya veo.  Sin embargo, no entiendo porqué se dice que dividiendo por
> > 8 la distribución de hashes es más homegénea (dividir por una
> > constante no veo que afecte a la distribución de una función).
>
> El tema es que si __hash__() es la dirección de memoria, ésta estará
> alineada, normalmente en múltiplo de 4 u 8 bytes. Es decir, los 2 o 3
> bits de menor peso serán siempre cero. No nos ayudan nada a mejorar
> la aleatoriedad del hash. Diviendo por 8 tiramos esos bits y hacemos
> sitio para otros.
>
> > O sea, que de manera consistente, la hash sin dividir parece que
> > saca más rendimiento (un 15%) que la dividida por 8.  No sé, lo
> > mismo el rendimiento depende de la plataforma (o no he hecho bien
> > los cálculos).
>
> Hombre, es que dividir por 8 en tu código también consume recursos.
> En tu caso hay ocho millones de divisiones "extras".

Bueno, entonces se puede usar el truco de laisozillo de 'correr' 0 bits:

In [30]: timeit 1000 >> 3
10000000 loops, best of 3: 27.4 ns per loop

In [31]: timeit 1000 >> 0
10000000 loops, best of 3: 27.4 ns per loop

In [32]: timeit 1000
10000000 loops, best of 3: 17.8 ns per loop

> Estamos hablando de hacer esto en C, no en Python. No consume
> recursos y la dispersión de bits de "__hash__()" es mejor.

Mmm, no tengo claro que el cuello de botella esté en la evaluación del 
operador shift, pero todo podría ser.

Saludosm

-- 
Francesc Alted
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es