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

2024-09-28 03:20:52 发布

您现在位置: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)

例如:

我想并行化构建函数

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%。 会发生什么

谢谢


Tags: 函数importbuildselfdefmpelementtesting
1条回答
网友
1楼 · 发布于 2024-09-28 03:20:52

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

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

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]

相关问题 更多 >

    热门问题