2012-06-20 111 views
5

我正在建立一個包含整數鍵和列表值的字典。爲這本字典增加值似乎是一個真正的瓶頸,但我想知道是否有某種方法可以加速我的代碼。Python:使用列表值添加到字典的最佳方式

class myClass(): 

    def __init__(self): 
    self.d = defaultdict(list) 

    def addValue(self, index, value): 
    self.d[index].append(value) 

這真的是這樣做的最佳方式?我並不關心值的順序,所以也許有一個更合適的數據結構,並有更快的附加值。然後,'追加'似乎不是主要問題,因爲如果我簡單地追加到一個空列表中,代碼要快得多。我猜這是以前存儲的列表大部分時間的加載?


我發現,這個問題是不是在快譯通,但列表中的append(雖然我在原來的職位,對此我表示歉意另有要求)。這個問題是由於Python的垃圾收集器中的一個錯誤引起的,在this other question上有很好的解釋。在添加所有值然後重新啓用它之前禁用gc,將極大地加速該過程!

+2

將項目添加到列表並獲取對象或字典中的值都是不花時間的。爲了加速程序,您可以通過分析找到瓶頸,而不是通過更改隨機代碼段。 –

+0

將項目映射到現有密鑰的速度明顯快於將值添加到新密鑰? –

+0

我剛剛發現問題不在字典中,但在列表中追加(儘管我在原始文章中聲明瞭其他內容,對此我表示歉意)。然後我在http://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressively-slower上找到了我的問題的答案。由於我是這個網站的新手,在這種情況下,我不知道標準程序是什麼:我應該刪除原始文章嗎?或者添加上面的細節並回復帖子? – niefpaarschoenen

回答

0

作爲一個結論,我可以說,我原來的問題中的代碼比其他所有的建議更快或更快。

2

比較它這樣的:

class myClass(): 

    def __init__(self): 
    self.d = {} 

    def addValue(self, index, value): 
    self.d.setdefault(index, []).append(value) 
+1

出於好奇,爲什麼這會更快?我曾認爲'defaultdict'在幕後非常相似。 –

+1

經過短暫的測試,我發現這不是更快。我只是喜歡它。 – eumiro

+0

我認爲它幕後實際上是一樣的;時間在任何情況下都是相似的......但我更喜歡defaultdict,因爲一般來說你必須輸入less。 – niefpaarschoenen

1

他們說:「更好的請求原諒比許可。」現在你不是要求個人許可,但我認爲defaultdict確實可以,這就是放慢速度的原因。

try這樣的:

class myClass(): 

    def __init__(self): 
    self.d = {} 

    def addValue(self, index, value): 
    try: 
     self.d[index].append(value) 
    except KeyError: 
     self.d[index] = [value] 

此嘗試訪問index關鍵的單詞表,如果它不存在,它會提高一個KeyError,並在採取行動。

它更快嗎?

+0

我試圖比較你的代碼和代碼(使用[timeit](http://docs.python.org/library/timeit.html))。 my.addValue(3,「cd」) my.addValue(4,「ef」) my.addValue(3,「ab」) my.addValue (4,「gh」)'原始代碼更快!在我的機器上24.66 usec代碼和18.10 usec代碼問題。所以看起來這種方法不是答案。 – stalk

+1

似乎你有最快的解決方案:) – jadkik94