【问题标题】:Parallel Processing in Python with nested loop使用嵌套循环在 Python 中进行并行处理
【发布时间】:2019-11-19 12:07:44
【问题描述】:

由于性能问题,我想在 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

据我了解,我必须给出 1 个可迭代的应用函数。但我的想法是做类似的事情:

results = [pool.apply(createpath, args=(source_nodes, sink_nodes))]

然后不要给任何可迭代对象给applyfunction 我设法让它工作,但我认为它不能并行运行。

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

【问题讨论】:

  • 如果你想并行运行你的循环,你可以尝试在 C++ 中使用类似于 openMP 的工具,例如,Pymp。这使您可以为每个核心提供其迭代部分,并为所有核心提供并行循环。您应该使用归约来获得结果。
  • 哦,谢谢,但我想避免安装任何其他外部工具,因为我知道我在由其他部门管理的虚拟机上运行此代码。
  • 那么,也许你可以尝试通过在参数中给出循环范围来实现类似的目标。然后每个核心将只处理整个循环中它自己的部分。
  • 谢谢你的评论,你能不能多发展一点你的想法,我觉得这对我来说有点难以理解

标签: python pandas parallel-processing multiprocessing


【解决方案1】:
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 个线程池上的映射模式并行运行。在这种情况下,您的输出结果是池中每个进程的结果之和。

【讨论】:

  • 此代码不组装请求的 list-of-lists,为所有 source-sink 路径生成(也不是一对部分列表,每个列表每个池成员过程,稍后加入),按照 O/P 的要求。缩放也很重要,尝试通过 1E9 源-汇图验证您的代码在 1E9 以上某处的缩放,以查看在分离的进程中完成这项工作的成本,并发布更正的代码及其缩放属性基准
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多