【发布时间】:2012-03-10 03:16:58
【问题描述】:
我正在尝试实现对字典中排序元组的快速查找;回答“元组 (3,8) 是否具有关联值,如果是,它是什么?”的问题。让元组中的整数从下方以 0 为界,从上方以 max_int 为界。
我继续使用 Python 的 dict,但发现它非常慢。解决这个问题的另一种方法是创建一个带有 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.keys()而不是in d浪费了您的大部分时间;对我来说,将时间从 1.11s/0.003s 降低到 0.018s/0.0017s。如果您将这样的优化留在桌面上,那么担心速度是愚蠢的。 -
您可以使用
timeit来执行您的基准测试。更容易。
标签: python dictionary tuples key