首页 > 解决方案 > 为类的不同实例并行化 python 代码

问题描述

我的问题与并行化 python 代码有关,我想知道我们如何为类的不同实例运行函数以减少运行时间。

我所拥有的:我有一个A类的多个实例(存储在一个名为instances的列表中)。这个类有一个函数add。现在,我们有多个独立的任务,一个用于类A的每个实例,其中所有这些任务的输入是一件事(在我的示例中为数字n)。每个实例都需要对 n 应用函数add返回一个数字。我们希望将所有实例的返回数字存储在一个列表中(在我的示例中为列表结果)。

我想要的:正如你所看到的,在这个例子中,任务可以并行化,因为不需要一个等待另一个完成。我们如何并行化下面的简单代码?由于不同实例之间没有共享任何内容,我想我们甚至可以使用多线程,对吧?或者唯一的方法是使用多处理?

class A(object):
    def __init__(self, q):
        self.p = q

    def add(self, num):
        return self.p + num


instances = []
for i in xrange(5):
    instances.append(A(i))
n = 20
results = []
for inst in instances:
    results.append(inst.add(n))

print(results)

输出:[20、21、22、23、24]

标签: pythonmultithreading

解决方案


您的玩具代码似乎遵循的模式建议使用线程池/进程池将包装函数映射到列表。然而,您希望为每个实例应用的实例数量和基本算术运算表明并行化的开销将超过任何潜在的好处。

这样做是否有意义,取决于实例的数量和运行每个成员函数所需的时间。因此,在尝试并行化之前,请确保至少对代码进行一些基本分析。查明您尝试并行化的任务是受 CPU 限制还是受 IO 限制。

这是一个应该演示基本模式的示例:

# use multiprocessing.Pool for a processes-based worker pool
# use multiprocessing.dummy.Pool for a thread-based worker pool
from multiprocessing.dummy import Pool
# make up list of instances
l = [list() for i in range(5)]
# function that calls the method on each instance
def foo(x):
    x.append(20)
    return x
# actually call functions and retrieve list of results
p = Pool(3)
results = p.map(foo, l)
print(results)

显然,您需要填补空白以使其适应您的真实代码。

进一步阅读:

也可以看看期货

如果您真的想要这种并行,还可以考虑将您的计算移植到 GPU(那时您可能需要远离 Python)。


推荐阅读