并行化Python的reduce命令

时间:2018-06-15 15:48:18

标签: python performance parallel-processing mapreduce

在Python中,我运行了

形式的命令
reduce(func, bigArray[1:], bigArray[0])

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

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

然而,考虑到并行运行reduce的普遍性,我想看看是否有自动执行此操作的本机方式或库。

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

2 个答案:

答案 0 :(得分:3)

对于任何绊脚的人,我最终写了一个助手来做

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

请注意,您可以使用multiprocessing.cpu_count()

获取CPU数量。

使用此功能显示,与串行版本相比,其性能大大提高。

答案 1 :(得分:0)

如果您能够组合 map 和 reduce(或者想要连接结果而不是更通用的 reduce),您可以使用 mr4p:

https://github.com/lapets/mr4mp

类中_reduce函数的代码似乎是通过multiprocessing.pool实现并行处理来池化通常的reduce进程,大致遵循一个进程:

reduce(<Function used to reduce>, pool.map(partial(reduce, <function used to reduce>), <List of results to reduce>))

我还没有尝试过,但语法似乎是:

mr4mp.pool().mapreduce(<Function to be mapped>,<Function used to reduce>, <List of entities to apply function on>)