python - 并行化 Python 的 reduce 命令

标签 python performance parallel-processing mapreduce

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

reduce(func, bigArray[1:], bigArray[0])

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

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

但是,考虑到并行运行 reduce 的普遍性,我想看看是否有一种本地方法或库可以自动执行此操作。

我正在运行一台 6 核机器。

最佳答案

对于遇到这个问题的任何人,我最终编写了一个帮助程序来完成它

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 的数量

与串行版本相比,使用此功能可显着提高性能。

关于python - 并行化 Python 的 reduce 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50878960/

相关文章:

Python如何断言一个方法已被调用

python - 将 igraph 中的图保存为 eps 格式

r - 我可以告诉R plyr软件包默认情况下并行工作吗?

c# - 最多有 N 个线程按 FIFO 顺序执行的代码部分

python - 从源码安装 Opencv 到 conda 环境

python - 凯勒盒中的矩阵,检索值时出错

对于更多 DIV 项目,jQuery 拖放速度会变慢

mysql - 需要架构帮助 - MySQL 或 NoSQL 用于包含 5400 万条记录的表

java - 标准阿克曼可以优化吗?

java - 哪种方法是读取缓慢变化查找和丰富流输入集合的最佳方法?