[英]Creating (seeding) large dictionaries efficiently in Python
我有一個很長的(500K +行)兩列電子表格,如下所示:
Name Code
1234 A
1234 B
1456 C
4556 A
4556 B
4556 C
...
因此,有一個元素(帶有名稱)可以有許多代碼。 但是,每個代碼不是一行,而是希望列出每個元素發生的所有代碼。 我想要的是這樣的字典:
{"1234":["A","B"],"1456":["C"],"4556":["A","B","C"] ...]}
我試過的是這個(我不包括文件讀取語法)。
codelist = {}
for row in rows:
name,code = well.split()
if name in codelist.keys():
codelist[name].append(code)
else:
codelist[name] = [code]
這會產生正確的輸出,但進度變得非常慢。 所以我嘗試用鍵啟動我的字典:
allnames = [.... list of all the names ...]
codelist = dict.fromkeys(allnames)
for row in rows:
name,code = well.split()
if codelist[name]:
codelist[name].append(code)
else:
codelist[name] = [code]
這要快得多,我的問題是為什么? 每次程序是否仍然必須搜索dict中的所有鍵? 還有另一種方法來加速不包括遍歷樹的字典搜索嗎?
有趣的是我在使用相同的條件檢查時得到的錯誤(如果在codelist.keys():)中引用我的字典之后的名字。
Traceback (most recent call last):
File ....
codelist[name].append(code)
AttributeError: 'NoneType' object has no attribute 'append'
現在,有一個鍵但沒有要附加的列表。 所以我使用的代碼codelist[name]
也是<NoneType>
,似乎可行。 當mydict["primed key"]
是<NoneType>
時,這是什么意思? enter code here
前一個較慢,因為.keys()
必須首先在內存中創建所有鍵的列表,然后in
運算符對其執行搜索。 因此,它是對文本文件中每一行的O(N)
搜索,因此它很慢。
另一方面key in dict
搜索中的簡單key in dict
需要O(1)
時間。
dict.fromkeys(allnames)
dict.fromkeys
指定的默認值為None
,因此您無法在其上使用append
。
>>> d = dict.fromkeys('abc')
>>> d
{'a': None, 'c': None, 'b': None}
一個更好的解決方案是在這里使用collections.defaultdict
,如果不是一個選項,那么使用普通的dict
與簡單的if-else檢查或dict.setdefault
。
在Python3 .keys()
返回一個View對象,因此時間復雜度可能不同。 但是,它仍然會比key in dict
搜索中的普通key in dict
略慢一些。
您可能希望查看defaultdict
容器以避免檢查
from collections import defaultdict
allnames [.... list of all the names ...]
codelist = defaultdict(list)
for row in rows:
name,code = well.split()
codelist[name].append(code)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.