并行化 Python 的 reduce 命令

use*_*242 3 python parallel-processing performance mapreduce

在 Python 中,我正在运行以下形式的命令

reduce(func, bigArray[1:], bigArray[0])
Run Code Online (Sandbox Code Playgroud)

我想添加并行处理以加快速度。

我知道我可以通过拆分数组、在单独的部分上运行进程并组合结果来手动执行此操作。

然而,鉴于并行运行 reduce 无处不在,我想看看是否有一种本地方式或库可以自动执行此操作。

我正在运行一台具有 6 个内核的机器。

use*_*242 7

对于任何遇到这个问题的人,我最终写了一个帮手来做到这一点

def parallelReduce(l, numCPUs, connection=None):

    if numCPUs == 1 or len(l) <= 100:
            returnVal= reduce(reduceFunc, l[1:], l[0])
            if connection != None:
                    connection.send(returnVal)
            return returnVal

    parent1, child1 = multiprocessing.Pipe()
    parent2, child2 = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=parallelReduce, args=(l[:len(l) // 2], numCPUs // 2, child1, ) )
    p2 = multiprocessing.Process(target=parallelReduce, args=(l[len(l) // 2:], numCPUs // 2 + numCPUs%2, child2, ) )
    p1.start()
    p2.start()
    leftReturn, rightReturn = parent1.recv(), parent2.recv()
    p1.join()
    p2.join()
    returnVal = reduceFunc(leftReturn, rightReturn)
    if connection != None:
            connection.send(returnVal)
    return returnVal
Run Code Online (Sandbox Code Playgroud)

请注意,您可以获得 CPU 的数量 multiprocessing.cpu_count()

与串行版本相比,使用此功能显示出显着的性能提升。