uplas Python como chaves lenta
Estou tentando implementar uma pesquisa rápida para tuplas classificadas em um dicionário; algo que responde à pergunta "A tupla (3,8) tem um valor associado e, se sim, qual é?". Permita que os números inteiros nas tuplas sejam vinculados de baixo por 0 e de cima por max_int.
Fui em frente e usei o ditado de Python, mas achei que era bem lento. Outra abordagem para esse problema seria criar uma lista T com max_int (principalmente vazios) dictos e, para cada tupla (3,8), colocar T [3] [8] = value. Eu acho que essa é exatamente a abordagem de hash de balde que o Python adota com os dictos, mas o último é cerca de 30 vezes (!) Mais rápido aqu
Além disso, é feio (especialmente porque agora estou prestes a implementar três tuplas), então eu aprecio muito algumas dicas aqu
Para referência, aqui está o código que eu usei para obter os horários:
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