我想创建一个图形,因为有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()
这也没有解决问题。
答案 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)。