辞書のソートされたタプルの高速検索を実装しようとしています。 "タプル(3,8)には関連する値がありますか?そうであれば、それは何ですか?"という質問に答えるものです。タプル内の整数を下から0で、上からmax_intで束縛させます。Pythonタプルがキーとして遅いですか?
私は先に進み、Pythonのdictを使用しましたが、かなり遅いことがわかりました。この問題に対するもう1つのアプローチは、max_int(主に空の)dictsを持つリストTを作成し、各タプル(3,8)に対してT [3] [8] = valueを入れることです。 これはまさにPythonがdictsで取るバケットハッシュのアプローチですが、後者はここでは約30倍(!)高速です。
また、醜いです(特に3タプルを実装しようとしているので特にそうです)。私はここでいくつかのヒントを感謝したいと思います。
参考のために、ここで私はタイミングを取得するために使用されるコードは次のとおりです。
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
'in d'の代わりに' in d.keys() 'を使うと時間の大部分が無駄になります。 1.11s/0.003sから0.018s/0.0017sに時間を短縮した私のために。テーブルのような最適化を離れるならば、スピードを心配するのは愚かです。 – DSM
'timeit'を使用してベンチマークを実行できます。より簡単に。 –