在 python 中使用多处理划分一个巨大的 for 循环
Dividing a huge for loop using multiprocessing in python
我想创建一个图,因为有 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 = Pool(processes=20)
pool.map(generate_edges,call_record_dict)
pool.close()
pool.join()
这也没有解决问题。
试试这个:
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,也从未使用过,很抱歉,这还没有经过全面测试
如果 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)。
我想创建一个图,因为有 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 = Pool(processes=20)
pool.map(generate_edges,call_record_dict)
pool.close()
pool.join()
这也没有解决问题。
试试这个:
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,也从未使用过,很抱歉,这还没有经过全面测试
如果 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)。