我有一大堆dicts(200,000+),需要根据密钥多次(~11,000)过滤这些dicts。最快的方法是什么?
我正在检索一个dicts(olist)列表,大约225,000个dicts,我正在尝试根据单个键('type')过滤这些dicts。目前,我构建了一个列表中的所有“类型”,然后迭代它,过滤每个“类型”的dicts。我的问题是这个初始'类型'过滤器需要〜。3s,这需要差不多一个小时才能运行。我使用穿线让我降到10多分钟,但我希望接近一半。 Bellow是我的代码的相关片段,是否有更快的方法(更快的过滤器或更有效的算法)?
tLim = threading.BoundedSemaphore(500)
...
olist = _get_co_(h) ## this returns a list of ~225,000 dictionaries
idlist = list(set([d['type'] for d in olist])) ## returns list of ~11,000
for i in idlist:
t = Thread(target=_typeData_, args=(i,olist,cData))
threads.append(t)
def _typeData_(i,olist,cData):
tLim.acquire()
tList = list(filter(lambda x: x['type'] == i, olist)) ## takes ~0.3s
do stuff with tList ## takes ~0.01s
请注意,我看看生成器表达式,但似乎必须存储和回忆结果可能会更糟?我没有尝试过,我不确定如何实现它......
此外,增加信号量并不能提高时间,如果有的话。
答案 0 :(得分:1)
您可以按类型对字典进行分组,以便以后可以避免使用filter
:
from collections import defaultdict
id_groups = defaultdict(list)
for dct in olist:
id_groups[dct['type']].append(dct)
现在您根本不需要过滤,只需迭代此id_groups
,您就会得到该类型所有词典的列表:
for i, tList in id_groups.items():
# the i and tList are identical to your variables in the "_typeData_" function.
# do something with tList