在python中使用多处理划分一个巨大的for循环

时间:2016-02-24 18:38:08

标签: python multiprocessing

我想创建一个图形,因为有2600个节点,我必须遍历每个节点以创建边缘,我的for循环运行了近600万次。因此,我正在尝试进行多处理以使其更快。现在我想要的是创建20个进程并在它们之间划分600万行。我写了以下代码,但它没有用。

from igraph import *
from multiprocessing import Process    

def generate_edges(call_record_dict):
    for index, key in enumerate(call_record_dict):
        for index2, key2 in enumerate(call_record_dict):
            if(key!=key2):
                if(call_record_dict[key]==call_record_dict[key2]):
                    if(g.are_connected(index, index2) is False):
                        g.add_edges((index,index2))

def generate_graph(call_record_dict):
    g=Graph()
    g.add_vertices(len(call_record_dict))
    for i in range(20):
        p = Process(target=generate_edges, args=(call_record_dict))
        p.start()

我尝试过使用游泳池。

pool = Pool(processes=20)
pool.map(generate_edges,call_record_dict)
pool.close()
pool.join()

这也没有解决问题。

2 个答案:

答案 0 :(得分:0)

试试这个:

from igraph import *
import  multiprocessing as mp

def generate_edges(call_record_dict):
    for index, key in enumerate(call_record_dict):
        for index2, key2 in enumerate(call_record_dict):
            if(key!=key2):
                if(call_record_dict[key]==call_record_dict[key2]):
                    return (index, index2)



def generate_graph(call_record_dict):
    g=Graph()
    g.add_vertices(len(call_record_dict))
    pool = mp.Pool(4)
    for index, ret in pool.map(generate_edges, call_record_dict):
        # ret = (index, index2)
        if(g.are_connected(ret) is False):
            g.add_edges((ret))

我没有igraph,也从未使用它,所以对不起,这还没有经过充分测试

答案 1 :(得分:0)

如果call_record_dict中的值是可清除的并且对于每个连接都是唯一的,那么您可以尝试不同的方法。

from collections import defaultdict
import itertools as it

matches = defaultdict(list)

for index, value in enumerate(call_record_dict.values()):
    matches[value].append(index)

for values in matches.values():
    for index1, index2 in it.combinations(values, 2):
        g.add_edge((index1, index2))
        g.add_edge((index2, index1))

运行时间应为O(n),其中n为字典长度,而不是O(n ^ 2)。