Python 中简单迭代函数的并行化

Parallelization of a simple iteration function in Python

我试图通过使用多处理的并行化来在迭代函数中实现良好的执行时间,但我无法做到这一点。

我的功能是这样的

    for i in range(len(self.set)):
        degree = self.__degree__(self.set[i])
        self.subsets.append(degree)

我用

来称呼它
self.__build__()

--

我试着做了一个类似的平行版本:

    def __buildParallel__(self, i):
        degree = self.__degree__(self.set[i])
        self.subsets[i].append(degree)

我调用并行版本使用

    import multiprocessing as mp
    pool = mp.Pool()  
    pool.map(self.__buildParallel__, self.set)

示例:

我想并行化 build 函数

import math
class Testing(object):
    def __init__(self, inputSet):
        self.set = inputSet
        self.subsets = []
        self.__build__()

    def __build__(self):
        for i in range(len(self.set)):
            degree = self.__degree__(self.set[i])
            self.subsets.append(degree)
                               
    def __degree__(self, element):
        return element[0] * 0.01

anObject = Testing([[1],[2],[3],[4],[5]])

--

尝试并行版本

import math
import multiprocessing as mp

class Testing(object):
    def __init__(self, inputSet):
        self.set = inputSet
        self.subsets = []
        pool = mp.Pool()  
        pool.map(self.__buildParallel__, self.set)

    def __buildParallel__(self, i):
        degree = self.__degree__(self.set[i])
        self.subsets[i].append(degree)
                               
    def __degree__(self, element):
        return element[0] * 0.01

anObject = Testing([[1],[2],[3],[4],[5]])

发生的情况是程序根本没有 运行 并且所有处理器都达到 100% 使用率。 可能发生了什么?

谢谢

对进程中的 class 所做的任何修改都是在该进程的上下文中进行的,不会更改原始 class。使用 pool.map,映射函数的 return 值将被收集并 returned。

请注意,创建池进程会产生开销,因此这个简单的示例通常会 运行 并行运行较慢,但我添加了一个睡眠以显示并行工作需要一些时间。

import math
import multiprocessing as mp
import time

class Testing(object):
    def __init__(self, inputSet):
        self.set = inputSet
        with mp.Pool() as pool:
            self.subsets = pool.map(self.__buildParallel__,self.set)

    def __buildParallel__(self, i): # i is just one element, not whole set
        time.sleep(5)  # build time would be 25+ seconds if not parallel
        return self.__degree__(i)
                               
    def __degree__(self, element):
        return element[0] * 0.01

if __name__ == '__main__':
    anObject = Testing([[1],[2],[3],[4],[5]])
    print(anObject.set)
    print(anObject.subsets)

结果(5 秒后):

[[1], [2], [3], [4], [5]]
[0.01, 0.02, 0.03, 0.04, 0.05]