Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 并行合并两个大词典_Python_Performance_Dictionary_Merge - Fatal编程技术网

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请看这个食谱:谢谢。我知道字典在修改值方面是线程安全的,但有两个挑战:大容量和共享内存。你的帖子都没有提到这些挑战。