2013-04-02 84 views
2

目前我在我的程序中使用了5個字典,其中2個字典有13萬個鍵值對。每個Dict都是pair,其中key是長度爲1-6的char值,value是key,value對的另一個字典,現在key的長度爲1-12,值爲元組。Python中的哈希表

在python中的這個解決方案工作正常,但效率不高,每次執行查找計數約爲80萬。當用c寫的服務器上的另一個腳本是使用GHashTable的實時過濾應用程序時,他的性能非常出色。

我的問題是如果有任何對象或實現使用GHashTable像哈希函數是python爲我的要求。 python中的字典使用散列,但爲什麼它在緩慢的重記錄中。與c的GHashTable相比,python字典使用的哈希效率不高。在python中有沒有更好的Hash實現?

python dict在數百萬條記錄中工作正常,但在重載情況下,它無法響應O(1)。

你的Python過程是否適合RAM? 是的,我有18GB的RAM,只有8GB是爲postgres和其他東西保留的。而10GB可用於處理。

+2

說實話,考慮到數據的大小和性能要求,純Python可能根本就不是這項任務的最佳選擇。 (+1) – NPE

+3

您似乎認爲問題與散列表有關,但您是否有任何證據?確保查找本身實際上是問題。 – delnan

+1

沒有一個顯示你的問題的工作示例,並且一些分析你不能分辨出什麼問題。 AFAIK python的'dict'很快。他們和GHashTable之間沒有很大的性能差異,至少對於大多數用例而言。 – Bakuriu

回答

0

當發生散列衝突時,dict通過使用__eq__方法來檢查值是否相等,從而解決衝突。這似乎是你放慢速度的原因。

因此,如果對於某些密鑰a和b,如果hash(a) == hash(b),則我們通過檢查my_dict[a]my_dict[b]來解決衝突。

例如,通過蠻力,我們發現hash(2**1000)等於hash(16777216)。我們來測試一下,

>>> my_dict ={} 
>>> my_dict[2**1000] = "One" 
>>> my_dict[16777216] = "Two" 
>>> 
>>> 
>>> for k,v in my_dict.items(): 
...  print(hash(k), v) 
... 
16777216 One 
16777216 Two