python - 为类的不同实例并行化 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]
解决方案
您的玩具代码似乎遵循的模式建议使用线程池/进程池将包装函数映射到列表。然而,您希望为每个实例应用的实例数量和基本算术运算表明并行化的开销将超过任何潜在的好处。
这样做是否有意义,取决于实例的数量和运行每个成员函数所需的时间。因此,在尝试并行化之前,请确保至少对代码进行一些基本分析。查明您尝试并行化的任务是受 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)
显然,您需要填补空白以使其适应您的真实代码。
进一步阅读:
- https://docs.python.org/3/library/multiprocessing.html
- https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.dummy
- 如何在 Python 中使用线程?
- https://wiki.python.org/moin/GlobalInterpreterLock
- 什么是全局解释器锁 (GIL)?
- 术语“CPU 限制”和“I/O 限制”是什么意思?
也可以看看期货:
- https://pymotw.com/3/concurrent.futures/index.html#module-concurrent.futures
- https://docs.python.org/3/library/concurrent.futures.html
如果您真的想要这种并行,还可以考虑将您的计算移植到 GPU(那时您可能需要远离 Python)。
推荐阅读
- javascript - 对于无限滑块,转换在 react.js 中不起作用
- python - 从上一个目录导入文件?
- typescript - Next.js 首次加载 JS 时间减少
- android - 如何进行分页以使片段中的代码更少而无需分页 3
- amazon-web-services - 亚马逊是否会因使用 Lightsail 超出可持续区域而向我收取额外费用?
- java - Spring-Boot:创建自定义注释类的实例
- python-3.x - Pyspark:使用 google bigquery 连接器使用 aws 胶水作业将嵌套数据插入 bigquery 时出现问题
- node.js - 如何在 vs 代码中调试 selenium nodejs 黄瓜测试?
- redux - TypeError:您在预期流的位置提供了无效对象。您可以提供 Observable、Promise、Array 或 Iterable。在浏览器中抛出
- command-line - 在 tmux 中运行命令并更新状态栏