我有一個很大(以千爲單位)字的值集合:float(float)對。我需要找到最好的值並提取相應的關聯詞。例如,我有(a,2.4),(b,5.2),(c,1.2),(d,9.2),(e,6.3),(f,0.4)。我想(d,9.2)作爲輸出。查找字典與numpy數組中的最大值的性能
目前,我正在使用字典來存儲這些元組,並使用max操作符來檢索字典中的最大鍵值。我想知道一個numpy數組是否會更有效率。在這裏徵求專家意見。
我有一個很大(以千爲單位)字的值集合:float(float)對。我需要找到最好的值並提取相應的關聯詞。例如,我有(a,2.4),(b,5.2),(c,1.2),(d,9.2),(e,6.3),(f,0.4)。我想(d,9.2)作爲輸出。查找字典與numpy數組中的最大值的性能
目前,我正在使用字典來存儲這些元組,並使用max操作符來檢索字典中的最大鍵值。我想知道一個numpy數組是否會更有效率。在這裏徵求專家意見。
這裏使用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]
計時:fa 67μs,fb 2300μs,fc 2580μs,fd 3780μs。
因此,使用Numpy(fa)的速度比使用普通列表(fb)或字典(fc)的速度快30倍,因爲構建Numpy數組的時間不被考慮在內。 (fd將其考慮在內)
*「我想知道numpy數組是否會更有效率」* ...答案是......? – mac 2012-01-01 16:53:42
@mac添加了答案的結論。 – 2012-01-01 17:00:05
我們確實需要OP的更多信息來回答這個問題。他說他目前正在使用一個字典存儲這個單詞值對,他是否願意將它們存儲在ndarray中? – 2012-01-01 17:18:15
我不明白在這種情況下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!
Mac,感謝您的詳細回覆。請注意,元組可以直接構建到ndarray,而不是先將其放入字典中,然後轉換爲ndarray。原帖中的例子只是爲了演示。 – Dexter 2012-01-01 19:55:14
您是否需要將元組存儲在一個結構中,或者您可以在飛行中生成元組?如果您需要多個最大項目,則可以使用「heapq」http://docs.python.org/library/heapq.html。你正在解決什麼樣的問題,你確定這部分是麻煩來源嗎? – 2012-01-01 12:43:49
我需要將元組存儲在結構中。我只想找到最大數值和相應的'鍵'。 – Dexter 2012-01-01 12:47:40