2012-01-01 90 views
2

我有一個很大(以千爲單位)字的值集合: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數組是否會更有效率。在這裏徵求專家意見。

+0

您是否需要將元組存儲在一個結構中,或者您可以在飛行中生成元組?如果您需要多個最大項目,則可以使用「heapq」http://docs.python.org/library/heapq.html。你正在解決什麼樣的問題,你確定這部分是麻煩來源嗎? – 2012-01-01 12:43:49

+0

我需要將元組存儲在結構中。我只想找到最大數值和相應的'鍵'。 – Dexter 2012-01-01 12:47:40

回答

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] 

計時:fa 67μs,fb 2300μs,fc 2580μs,fd 3780μs。

因此,使用Numpy(fa)的速度比使用普通列表(fb)或字典(fc)的速度快30倍,因爲構建Numpy數組的時間不被考慮在內。 (fd將其考慮在內)

+0

*「我想知道numpy數組是否會更有效率」* ...答案是......? – mac 2012-01-01 16:53:42

+0

@mac添加了答案的結論。 – 2012-01-01 17:00:05

+0

我們確實需要OP的更多信息來回答這個問題。他說他目前正在使用一個字典存儲這個單詞值對,他是否願意將它們存儲在ndarray中? – 2012-01-01 17:18:15

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!

+0

Mac,感謝您的詳細回覆。請注意,元組可以直接構建到ndarray,而不是先將其放入字典中,然後轉換爲ndarray。原帖中的例子只是爲了演示。 – Dexter 2012-01-01 19:55:14