并行合并两个大词典

时间:2015-05-05 18:05:42

标签: python performance dictionary merge

我有两本大词典。他们每个人都是这样的 {"md5":(value1,value2)}。它们中的每一个都包含多达1000万个元素(我使用dict.fromkeys()来生成它们)。但现在我想将它们合并为一个,以消除重复。最快的方法是什么?我可以并行化吗?这似乎是一个CPU限制的问题,因为如果我使用dict.update(),一个核心总是100%使用,而其他核心是空闲的。

3 个答案:

答案 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