Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.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_Pandas_Parallel Processing_Multiprocessing - Fatal编程技术网

Python中嵌套循环的并行处理

Python中嵌套循环的并行处理,python,pandas,parallel-processing,multiprocessing,Python,Pandas,Parallel Processing,Multiprocessing,由于性能问题,我想在python中并行运行我的函数: import multiprocessing as mp source_nodes = [10413173, 10414530, 10414530, 10437199] sink_nodes = [10420346, 10438770, 10438711, 10414530, 10436258] path =[] def createpath(source,sink): for i i

由于性能问题,我想在python中并行运行我的函数:

import multiprocessing as mp

source_nodes = [10413173,    10414530,   10414530,   10437199]
sink_nodes =  [10420346,     10438770,   10438711,   10414530,   10436258]
path =[]    


def createpath(source,sink):
    for i in source:
        for j in sink:
            path = path + list(nx.all_simple_paths(Directed_G,i,j))
    return path
根据我的理解,我必须给出一个应用函数的iterable。但我的想法是这样做:

results = [pool.apply(createpath, args=(source_nodes, sink_nodes))]
然后不要给applyfunction提供任何iterable对象 我设法让它工作,但我认为它不能并行运行

你认为我应该在第一个循环中包含apply函数吗

from multiprocessing import Pool


source_nodes = [1,2,3,4,5,6]
sink_nodes =  [1,1,1,1,1,1,1,1,1]


def sum_values(parameter_tuple):
    source,sink, start, stop = parameter_tuple
    out = 0
    for i in range(start, stop):
        val_i = source[i]
        for j in sink:
            out += val_i*j
    return out

if __name__ == "__main__":
    params = (source_nodes, sink_nodes, 0, 6)
    print(sum_values(params))
    with Pool(2) as p:
        print(p.map(sum_values, [
            (source_nodes, sink_nodes, 0, 3),
            (source_nodes, sink_nodes, 3, 6),
        ]))
你可以试着运行这个。这与2个线程池上的映射模式并行运行。在这种情况下,输出结果是池中每个进程的结果之和


你可以试着运行这个。这与2个线程池上的映射模式并行运行。在这种情况下,输出结果是池中每个进程的结果之和。

如果你想并行运行你的循环,你可以尝试使用类似于C++中的OpenMP的工具,例如。这允许您在prallel中为每个核心提供其迭代部分和所有核心循环。您应该使用reduce来获得结果。哦,谢谢,但我想避免安装任何其他外部工具,因为我知道我正在其他部门管理的虚拟机上运行此代码。因此,也许您可以尝试通过在参数中提供循环范围来实现类似的目标。然后,每个核心只处理它自己的整个循环的一部分。谢谢你的评论,你能开发更多的想法吗?我认为这有点难以理解,如果你想并行运行你的循环,你可以尝试使用类似于C++中的OpenMP的工具,例如。这允许您在prallel中为每个核心提供其迭代部分和所有核心循环。您应该使用reduce来获得结果。哦,谢谢,但我想避免安装任何其他外部工具,因为我知道我正在其他部门管理的虚拟机上运行此代码。因此,也许您可以尝试通过在参数中提供循环范围来实现类似的目标。那么每个核心将只处理整个循环中自己的一部分。谢谢你的评论,你能再发展一点你的想法吗?我想这有点难以理解,因为这段代码没有汇编为所有源-接收器路径生成的请求列表(不是一对部分列表,每个池成员进程都有一个,以后要加入),正如O/P所要求的那样。此外,缩放也很重要,请尝试验证您的代码在1E9×1E9源-汇图上的缩放比例,以查看在单独的进程中执行此任务的成本,并发布已更正的代码及其缩放属性基准。此代码不会组合为所有源-汇图生成的请求列表hs(不是一对部分列表,每个池成员进程一个,稍后加入),正如O/P所要求的那样。此外,扩展也很重要,请尝试验证您的代码在1E9×1E9源-汇图之上的扩展,以查看在单独的进程中执行此项工作的成本,并将更正后的代码及其扩展属性作为基准进行发布