Estoy tratando de implementar una búsqueda rápida de tuplas ordenadas en un diccionario; algo que responde a la pregunta "¿Tiene la tupla (3,8) un valor asociado, y si es así, qué es?". Deje que los enteros en las tuplas se vinculen desde abajo por 0 y desde arriba por max_int.tuplas de Python como teclas lentas?
Me adelanté y usé el dict de Python, pero encontré que era bastante lento. Otro enfoque para este problema sería crear una lista T con max_int (en su mayoría vacíos) dicts, y para cada tupla (3,8) poner T [3] [8] = valor. Creo que este es exactamente el enfoque de cubo y pico que Python toma con los dicts, pero este último es aproximadamente 30 veces (¡!) Más rápido aquí.
También, sin embargo, es feo (especialmente porque ahora estoy por implementar 3-tuplas), así que agradecería algunas sugerencias aquí.
Como referencia, aquí está el código que utiliza para obtener los tiempos:
import numpy as np
import time
# create a bunch of sorted tuples
num_tuples = 10
max_int = 100
a = np.random.rand(num_tuples,2) * max_int
a = a.astype(int)
for k in xrange(len(a)):
a[k] = np.sort(a[k])
# create dictionary with tuples as keys
d = {}
for t in a:
d[tuple(t)] = 42
print d
# do some lookups
m = 100000
start_time = time.time()
for k in xrange(m):
(3,8) in d.keys()
elapsed = time.time() - start_time
print elapsed
# now create the bucket-list structure mentioned above
t = [{} for k in xrange(max_int)]
for k in xrange(len(a)):
t[a[k][0]][a[k][1]] = 42
print t
# do some lookups
m = 10000
start_time = time.time()
for k in xrange(m):
8 in t[3].keys()
elapsed = time.time() - start_time
print elapsed
Una buena parte de su tiempo se desperdicia al usar 'en d.keys()' en lugar de 'en d'; para mí, que bajó los tiempos de 1.11s/0.003s a 0.018s/0.0017s. Si deja optimizaciones como esa en la mesa, es una tontería preocuparse por la velocidad. – DSM
Puede usar 'timeit' para realizar sus puntos de referencia. Mucho más fácil –