为类的不同实例并行化python代码

时间:2018-07-17 20:25:01

标签: python multithreading

我的问题与并行化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]

1 个答案:

答案 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)。