2011-03-30 20 views
5

Tengo pocas secuencias de comandos de python en las que almaceno de 5 a 10 millones de pares de valores de clave de cadena en un diccionario y consulto este diccionario entre 5 y 10 millones de veces. Noté que el dict de pitón no está funcionando muy bien. ¿Hay alguna otra implementación más adecuada para las claves de cadena?Python: Mejor implementación de diccionario

Editar:

Estoy teniendo dos grandes listas de nombres de personas y quiero que coincida con ellos, así que tomo una de ellas como la lista de referencia y tratar de aplicar diferentes heurística en cada nombre en la segunda lista de averiguar si eso existe en la primera lista. Entonces, tengo que consultar primero la lista 2-3 veces para cada nombre en la segunda lista. Esperanza, esto tiene sentido.

+0

¿Por qué no utiliza una base de datos? – Geo

+1

La base de datos no tiene ningún sentido. – Boolean

+1

Me resulta difícil de creer que las búsquedas de diccionario son el cuello de botella.Los diccionarios de Python son rápidos, y también tienen optimizaciones para el caso donde todas las claves son cadenas. ¿Estás seguro de que no se está tomando el tiempo "aplicando heurísticas diferentes"? ¿Ha realizado una evaluación comparativa con y sin las búsquedas en el diccionario? – Duncan

Respuesta

1

Wow. Un hashmap (diccionario) podría no ser ser la estructura que está buscando.

En lugar de utilizar cadenas, intente con una representación que le proporcione un hash bueno y rápido. ¿O realmente estás almacenando cadenas? Si es así, examine el "poder" en la oración anterior.

¿Podría darnos detalles sobre el problema que está abordando?

+0

corrigió la pregunta con detalles – Boolean

0

Como dijo Santiago Lezica, un diccionario no es la estructura que está buscando.

Quizás deberías probar Redis: http://redis.io. Es una tienda avanzada de valores-clave.

Hay una biblioteca para python here.

0

Desde su descripción suena como que también podría hacer:

set(names1).intersection(set(names2)) 

derecho?

De cualquier manera, parece que el problema es que su algoritmo es lento, en lugar de la implementación de las tablas hash de Python.

0

Incluso si no utiliza clases o llamadas a métodos, ponga su código en una función y llame a esa función. Las funciones de Python están altamente optimizadas, en parte porque accede a las variables locales más rápido que las variables globales.

El informe Python Performance Tips en la wiki de Python es una gran lectura sobre este tema.

1

Preguntas: ¿Esto es un problema de escala? ¿Se da cuenta de que el código se ejecuta más de dos veces más lento cuando tiene el doble de datos? ¿Es posible que se esté quedando sin memoria física y usando la memoria de intercambio?

10 millones de cadenas de 100 caracteres cada una es un gigabyte. Si tiene 2 conjuntos de esos, eso sería 2 gigabytes, que está cerca del límite de un proceso de WinXP de 32 bits.

Si aún no conoce la respuesta a esta pregunta, le recomiendo ejecutar una prueba con la base de datos en varios tamaños (potencias de 10 o 2) y ver si la curva de rendimiento tiene una discontinuidad.