Python 并行合并两个大词典
我有两本大字典。他们每个人看起来都像这样Python 并行合并两个大词典,python,performance,dictionary,merge,Python,Performance,Dictionary,Merge,我有两本大字典。他们每个人看起来都像这样 {md5:value1,value2}。其中每一个包含多达1000万个元素,我使用dict.fromkeys生成它们。但现在我想把它们合并成一个,以消除重复项。最快的方法是什么?我能把它并行化吗?这似乎是一个CPU受限的问题,因为如果我使用dict.update,一个内核总是100%使用,而其他内核是空闲的 这个答案可能是欺骗,但是如果使用a,那么仅仅创建链图的合并就是O1。越快越好。您使用的不是dict,而是类似dict的对象 折衷的办法是,结果集合中
{md5:value1,value2}。其中每一个包含多达1000万个元素,我使用dict.fromkeys生成它们。但现在我想把它们合并成一个,以消除重复项。最快的方法是什么?我能把它并行化吗?这似乎是一个CPU受限的问题,因为如果我使用dict.update,一个内核总是100%使用,而其他内核是空闲的 这个答案可能是欺骗,但是如果使用a,那么仅仅创建链图的合并就是O1。越快越好。您使用的不是dict,而是类似dict的对象 折衷的办法是,结果集合中的每个查找在基础dict中使用1或2个查找。如果这种开销在您的情况下是可以接受的,那么ChainMap就是答案。尝试以下方法:
x = {"md5":("value1","value2")}
y = {"md7":("value1","value2")}
z = dict(x.items() + y.items())
print z
谢谢你的回答。
事实上,我是通过自己写一段代码找到答案的。它与合并排序非常相似,但我已经对它进行了测试,并与我尝试的所有其他方法进行了比较
这是一段代码。其思想是首先对这两个字典进行排序,这很快,然后将它们转换为元组列表,然后合并它们。我希望有人能打败我,但这是迄今为止我所知道的最快的。结果是一个排序的元组列表,因此如果我想合并更多的大型字典,我可以对新输入进行排序,然后将其合并到现有的元组列表中
def merge(dict_01,dict_02):
sorted_01 = sorted(dict_01.items(),key=operator.itemgetter(0))
sorted_02 = sorted(dict_02.items(),key=operator.itemgetter(0))
# merge them
l = 0
r = 0
while True:
if sorted_02[r][0] > sorted_01[l][0]:
l += 1
# if l reaches the end, append all left on sorted_02 to sorted_01 and break
if l == len(sorted_01):
sorted_01 += sorted_02[r:]
break
elif sorted_02[r][0] < sorted_01[l][0]:
sorted_01.insert(l,sorted_02[r])
r += 1
l += 1
# if r reached the end, merging is done, break
if r == len(sorted_02):
break
# if l reaches the end, append all left on sorted_02 to sorted_01 and break
if l == len(sorted_01):
sorted_01 += sorted_02[r:]
break
else:
r += 1
if r == len(sorted_02):
break
return sorted_01
谢谢,但不幸的是,我只能使用Python2.6。Python3中引入了链图。@fanchyna请看这个食谱:谢谢。我知道字典在修改值方面是线程安全的,但有两个挑战:大容量和共享内存。你的帖子都没有提到这些挑战。