我试图快速查找字典中的排序元组;回答“这个元组(3,8)是否具有相关价值的问题,如果是,它是什么?”。让元组中的整数由下面的0和上面的max_int绑定。作为键慢的Python元组?
我继续使用Python的字典却发现是相当缓慢的。解决这个问题的另一种方法是创建一个带有max_int(大部分是空的)字典的列表T,并且对于每个元组(3,8)将T [3] [8] =值。 虽然这正是Python采用字典的bucket-hash方式,但后者在这里快了大约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
在d.keys()中使用'而不是'在d'中浪费了大部分时间。对我来说,这个时间从1.11s/0.003s降低到0.018s/0.0017s。如果你在桌面上留下这样的优化,那么担心速度是愚蠢的。 – DSM 2012-02-19 14:33:58
你可以使用'timeit'来执行你的基准测试。方式更容易。 – 2012-02-19 15:51:47