我有两本大词典。他们每个人都是这样的
{"md5":(value1,value2)}
。它们中的每一个都包含多达1000万个元素(我使用dict.fromkeys()
来生成它们)。但现在我想将它们合并为一个,以消除重复。最快的方法是什么?我可以并行化吗?这似乎是一个CPU限制的问题,因为如果我使用dict.update()
,一个核心总是100%使用,而其他核心是空闲的。
答案 0 :(得分:0)
这个答案可能是“作弊”,但是如果你使用ChainMap
,这个合并(只是创建ChainMap)就是O(1)。尽可能快。你没有使用dict,而是使用类似dict的对象。
权衡是生成的集合中的每个查找在底层的dicts中使用1或2个查找。如果在您的情况下这个开销是可以接受的,那么ChainMap就是答案。
答案 1 :(得分:0)
感谢您的所有答案。 实际上,我自己写了一段代码就找到了答案。它与合并排序非常相似,但我已对其进行了测试,并与我尝试过的所有其他方法进行了比较。
这是一段代码。我们的想法是首先对这两个字典进行排序(这很快)并将它们转换为元组列表,然后合并它们。我希望有人可以打败我,但这是迄今为止我所知道的最快的。结果是一个排序的元组列表,所以如果我想合并更多的大字典,我可以对新输入进行排序并将其合并到现有的元组列表中。
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
答案 2 :(得分:-1)
试试这个:
x = {"md5":("value1","value2")}
y = {"md7":("value1","value2")}
z = dict(x.items() + y.items())
print z