我有一个大的(成千上万)单词集合:value(float)对。我需要找到最好的值并提取相应的关联词。例如,我有(a,2.4),(b,5.2),(c,1.2),(d,9.2),(e,6.3),(f,0.4)。我想(d,9.2)作为输出。
目前,我使用字典来存储这些元组,并使用max运算符来检索字典中的最大键值。我想知道一个numpy数组是否会更有效率。在这里征求专家意见。
答案 0 :(得分:4)
在这种情况下,我没有看到numpy数组如何帮助你。
特别是,将数据结构转换为另一个(在您的情况下是numpy数组或heapq中的元组列表)将比查找迭代每个元组的最大值慢得多。这是因为转换数据结构还需要迭代原始结构,并为新结构实例化对象,并将值存储到新结构中,再使用新结构获取请求的值。
使用列表的内置函数或方法很可能会导致更快的计算。我能想到的最简单的实现:
>>> li = [('a', 10), ('b', 30), ('c', 20)]
>>> max(li, key=lambda e : e[1])[0]
'b'
其他可能的,如果你也对最低值或从列表中弹出的东西感兴趣,你找到的值可以通过排序(所以你只检查原始列表一次!):
>>> li = [('a', 10), ('b', 30), ('c', 20)]
>>> li.sort(key=lambda e : e[1])
>>> li
[('a', 10), ('c', 20), ('b', 30)]
>>> li[-1][0]
'b'
或者:
>>> sorted(li, key=lambda e: e[1])[-1][0]
'b'
HTH!
答案 1 :(得分:2)
在这里使用Numpy会将浮点值保持在单独的ndarray
中。使用argmax
查找最大值索引,并从单独的列表中获取单词。这是非常快的,但构建ndarray只是为了找到最大值不是。例如:
import numpy as np
import operator
names = [str(x) for x in xrange(10000)]
values = [float(x) for x in xrange(10000)]
tuples = zip(names, values)
dic = dict(tuples)
npvalues = np.fromiter(values, np.float)
def fa():
return names[npvalues.argmax()]
def fb():
return max(tuples, key=operator.itemgetter(1))[0]
def fc():
return max(dic, key=dic.get)
def fd():
v = np.fromiter((x[1] for x in tuples), np.float)
return tuples[v.argmax()][0]
计时:fa67μs,fb2300μs,fc2580μs,fd3780μs。
因此,使用Numpy(fa)的速度比使用普通列表(fb)或字典(fc)快30多倍,因为不考虑构造Numpy数组的时间。 (fd考虑到这一点)