在并行python(pp)中检索结果的方式太慢

时间:2015-01-14 18:07:54

标签: python parallel-processing parallel-python

我使用了并行python(pp)软件包,以便在我的4核笔记本电脑上执行串行并行处理。 以下是用于完成工作的脚本的快速摘要。在初始化并行python对象之后,我将我的任务分成4个作业并将它们检索到列表中。

import pp
ppservers = ()
job_server = pp.Server(ppservers = ppservers)

start = 1
end = 1000
parts = 4
step = (end-start)/parts + 1

jobs=[]
for i in xrange(parts):
   starti = pp_start + i * step - 1
   endi = min(pp_start + (i+1)*step - 1,pp_end)
jobs.append(job_server.submit(functionName,(arg1,arg2)))

results=[job() for job in jobs]

我注意到for循环性能相当快(在几秒钟内),但检索过程(结果=作业中的[job()作业])花费的时间太长(大约10分钟)。 / p>

有人可以解释为什么会这样,并建议一种解决这个问题的方法吗? 谢谢。

1 个答案:

答案 0 :(得分:0)

您正在产生1000个进程,因此这意味着1000个python实例。对于像你这样的小工作,它会让你慢下来。你不想要pp。更糟糕的是,如果您的ppservers通过网络(而不是本地进程),那么您不仅需要建立套接字连接的开销,而且还需要通过网络发送代码以产生python的开销。另一台计算机上的实例。如果您不想使用套接字和互联网连接,则可以强制pp仅通过设置ppservers=()在本地工作(您似乎已经在做)。 pp还必须序列化您的代码,并将其发送到进程,然后在另一个进程中重新构建代码对象 - 这也会减慢速度。我不会期待10分钟,除非你穿过套接字,或者你正在用生成的python实例来盯住你的记忆。

我建议在这种情况下使用线程而不是pp,所以multiprocessing库,因为你的函数看起来可能很小。

如果您想要一个为ppmultiprocessing提供良好抽象的库,以便您可以选择要为特定作业部署哪个而无需更改代码,则可以尝试{{1 }}。 pathos还为pathos提供了有助于加快速度的默认值和调整。然后你可以测试它运行你的功能最快的方式,并继续使用它。

pp

上面,我使用阻止映射执行>>> import pathos.pp as pp >>> import pathos.multiprocessing as mp >>> >>> def squared(x): ... return x**2 ... >>> pppool = pp.ParallelPythonPool() >>> mppool = mp.ProcessingPool() >>> >>> res = pppool.amap(squared, xrange(1000)) >>> sqd = mppool.map(squared, xrange(1000)) >>> sqd[:10], sqd[-10:] ([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [980100, 982081, 984064, 986049, 988036, 990025, 992016, 994009, 996004, 998001]) >>> >>> sq = res.get() >>> sq[:10], sq[-10:] ([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [980100, 982081, 984064, 986049, 988036, 990025, 992016, 994009, 996004, 998001]) >>> >>> thpool = mp.ThreadingPool() >>> s = thpool.imap(squared, xrange(1000)) >>> s = list(s) >>> s[:10], s[-10:] ([0, 1, 4, 9, 16, 25, 36, 49, 64, 81], [980100, 982081, 984064, 986049, 988036, 990025, 992016, 994009, 996004, 998001]) ,同时使用异步(非阻塞)映射执行multiprocessing。然后,我用线程做一个迭代器映射(利用pp)。顺便说一句,multiprocessing也提供与pathos和群集调度程序的连接(上面未显示)。

在此处获取MPIhttps://github.com/uqfoundation