我的问题与并行化python代码有关,我想知道我们如何为类的不同实例运行函数以减少运行时间。
我所拥有的:我有一个类 A 的多个实例(存储在名为 instances 的列表中)。此类具有功能 add 。现在,我们有多个独立的任务,每个类 A 的实例一个,其中所有这些任务的输入都是一件事(在我的示例中为数字 n )。每个实例需要将函数 add 应用于 n 并返回一个数字。我们希望将所有实例的返回数字存储在列表中(在我的示例中为列表 results )。
我想要的东西:如您所见,在此示例中,任务可以并行化,因为无需等待另一个任务就可以完成。我们如何并行化下面的简单代码?由于不同实例之间没有任何共享,我想我们甚至可以使用多线程,对吗?还是唯一的方法就是使用多重处理?
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]
答案 0 :(得分:2)
玩具代码似乎遵循的模式将建议使用线程池/进程池将包装函数映射到列表。但是,要为每个实例应用的实例数量和基本算术运算表明,并行执行此操作的开销将超过任何潜在的好处。
执行此操作是否有意义,取决于实例数量和运行每个成员函数所需的时间。因此,在尝试并行化此代码之前,请确保至少对代码进行一些基本配置。找出要并行执行的任务是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)。