gpt4 book ai didi

python - 使用多处理将方法并行应用于对象列表

转载 作者:太空狗 更新时间:2023-10-29 17:17:10 27 4
gpt4 key购买 nike

我创建了一个包含许多方法的类。其中一种方法非常耗时,my_process,我想并行执行该方法。我遇到了Python Multiprocessing - apply class method to a list of objects但我不确定如何将它应用于我的问题,以及它会对我类(class)的其他方法产生什么影响。

class MyClass():
def __init__(self, input):
self.input = input
self.result = int

def my_process(self, multiply_by, add_to):
self.result = self.input * multiply_by
self._my_sub_process(add_to)
return self.result

def _my_sub_process(self, add_to):
self.result += add_to

list_of_numbers = range(0, 5)
list_of_objects = [MyClass(i) for i in list_of_numbers]
list_of_results = [obj.my_process(100, 1) for obj in list_of_objects] # multi-process this for-loop

print list_of_numbers
print list_of_results

[0, 1, 2, 3, 4]
[1, 101, 201, 301, 401]

最佳答案

我要在这里反其道而行之,并建议坚持使用可能可行的最简单的方法;-) 也就是说,类似于 Pool.map() 的函数非常适合此操作,但仅限于传递单个参数。与其付出巨大的努力来解决这个问题,不如简单地编写一个只需要一个参数的辅助函数:一个元组。然后一切都变得简单明了。

这是一个采用这种方法的完整程序,它在 Python 2 下打印您想要的内容,而不管操作系统:

class MyClass():
def __init__(self, input):
self.input = input
self.result = int

def my_process(self, multiply_by, add_to):
self.result = self.input * multiply_by
self._my_sub_process(add_to)
return self.result

def _my_sub_process(self, add_to):
self.result += add_to

import multiprocessing as mp
NUM_CORE = 4 # set to the number of cores you want to use

def worker(arg):
obj, m, a = arg
return obj.my_process(m, a)

if __name__ == "__main__":
list_of_numbers = range(0, 5)
list_of_objects = [MyClass(i) for i in list_of_numbers]

pool = mp.Pool(NUM_CORE)
list_of_results = pool.map(worker, ((obj, 100, 1) for obj in list_of_objects))
pool.close()
pool.join()

print list_of_numbers
print list_of_results

大魔法

我应该指出,采用我建议的非常简单的方法有很多优点。除了它在 Python 2 和 3 上“正常工作”之外,不需要更改您的类,并且易于理解,它还可以很好地与所有 Pool 方法配合使用。

但是,如果您有多个要并行运行的方法,为每个方法编写一个小的辅助函数可能会有点烦人。所以这里有一点点“魔法”可以解决这个问题。像这样更改 worker():

def worker(arg):
obj, methname = arg[:2]
return getattr(obj, methname)(*arg[2:])

现在,单个辅助函数足以满足任意数量的方法和任意数量的参数。在您的具体情况下,只需更改一行以匹配:

list_of_results = pool.map(worker, ((obj, "my_process", 100, 1) for obj in list_of_objects))

或多或少明显的概括也可以迎合带有关键字参数的方法。但是,在现实生活中,我通常坚持最初的建议。在某些时候,迎合一概而论弊大于利。话又说回来,我喜欢明显的东西 ;-)

关于python - 使用多处理将方法并行应用于对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43002766/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com