Curiosidad sobre __hash__()

Chema Cortes pych3m4 en gmail.com
Mie Feb 11 13:26:55 CET 2009


El día 10 de febrero de 2009 18:15, Francesc Alted
<faltet en pytables.org> escribió:

> Pues sí, y hablando de conjeturas y elucubraciones, llama la atención
> que en los tiempos de arriba, para los objectos C() que no sobrecargan
> el método hash (por tanto, éste es equivalente a B()), los tiempos sean
> un 30% superiores que para objectos B().  He intentado entender lo que
> pasa pero no he podido :-/

Mirando de nuevo el código, no se ve nada especial. Si el objeto no
tiene definido un método __hash__ se usa directamente el valor del
puntero al objeto convertido en (objeto) entero largo con signo. No es
razón suficiente para tanta diferencia de tiempos.

En los tiempos para 32bits, se nota que el último caso ha tenido un
aumento significativo en el tiempo empleado por el sistema. Tal vez se
haya quedado sin memoria o algo. Prueba otra vez, pero cambiando el
orden.

En cuanto a los tiempos con 64bits, parecen tiempos demasiado altos
para N=10000, incluso para 1.000.000. De todos modos he notado que
depende mucho del orden en que se hagan las pruebas. Por ejemplo, mira
este curioso comportamiento:

In [23]: N=1000000

In [24]: %time dC=dict.fromkeys(C() for i in xrange(N))
CPU times: user 4.18 s, sys: 0.06 s, total: 4.24 s
Wall time: 4.30 s

In [26]: %time dC=dict.fromkeys(C() for i in xrange(N))
CPU times: user 9.74 s, sys: 0.23 s, total: 9.97 s
Wall time: 10.09 s

In [28]: %time dC=dict.fromkeys(C() for i in xrange(N))
CPU times: user 9.93 s, sys: 0.17 s, total: 10.10 s
Wall time: 10.24 s

In [30]: del dC

In [31]: %time dC=dict.fromkeys(C() for i in xrange(N))
CPU times: user 4.23 s, sys: 0.02 s, total: 4.25 s
Wall time: 4.29 s
_______________________________________________
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