【问题标题】:Parallelization of a simple iteration function in PythonPython中简单迭代函数的并行化
【发布时间】:2021-02-17 19:36:24
【问题描述】:

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

我的功能是这个

    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% 的使用率。 会发生什么?

谢谢

【问题讨论】:

  • edit这个问题,不要发布它作为答案。 (除非你真的想回答这个问题。)
  • 该示例未使用multiprocessing。该示例应演示您观察到的问题。
  • 好的。我发布了两个版本。
  • 多处理示例引发TypeError: list indices must be integers or slices, not list,它不是“未运行且所有处理器达到 100% 使用率”。

标签: python parallel-processing multiprocessing python-multiprocessing


【解决方案1】:

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

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

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]

【讨论】:

  • 马克,你能帮我解决一个新问题吗?非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 2023-04-01
  • 2017-03-24
  • 2020-06-10
  • 2011-05-05
  • 2021-11-15
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多