并行检索结果的方式太慢 python (pp)
way too slow in retrieving results in parallel python (pp)
我使用并行 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() for job in jobs])花费的时间太长(大约 10 分钟) .
有人可以解释这是为什么并推荐一种解决此问题的方法吗?
谢谢。
您正在生成 1000 个进程,这意味着 1000 个 python 实例。对于像你这样的小工作,它会让你放慢很多速度。您不希望 pp
为此。更糟糕的是,如果您的 ppservers
通过网络(而不是本地进程),那么您不仅有建立套接字连接的开销,而且还有通过网络发送代码以生成 python 另一台计算机上的实例。如果您不想使用套接字和互联网连接,您可以通过设置 ppservers=()
强制 pp
仅在本地工作(您似乎已经在这样做了)。 pp
还必须序列化您的代码,跨进程发送它,然后在另一个进程中重构代码对象——这也会减慢速度。我不希望 10 分钟,除非你正在通过套接字,或者你正在用生成的 python 个实例来固定你的内存。
在这种情况下,我建议使用线程而不是 pp
,-- 所以 multiprocessing
库,因为你的函数看起来可能很小。
如果您想要一个为 pp
和 multiprocessing
提供良好抽象的库,这样您就可以挑选并选择为特定作业部署哪个库而无需更改代码,您可以尝试 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
还提供与 MPI
和集群调度程序的连接(上面未显示)。
在此处获取 pathos
:https://github.com/uqfoundation
我使用并行 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() for job in jobs])花费的时间太长(大约 10 分钟) .
有人可以解释这是为什么并推荐一种解决此问题的方法吗? 谢谢。
您正在生成 1000 个进程,这意味着 1000 个 python 实例。对于像你这样的小工作,它会让你放慢很多速度。您不希望 pp
为此。更糟糕的是,如果您的 ppservers
通过网络(而不是本地进程),那么您不仅有建立套接字连接的开销,而且还有通过网络发送代码以生成 python 另一台计算机上的实例。如果您不想使用套接字和互联网连接,您可以通过设置 ppservers=()
强制 pp
仅在本地工作(您似乎已经在这样做了)。 pp
还必须序列化您的代码,跨进程发送它,然后在另一个进程中重构代码对象——这也会减慢速度。我不希望 10 分钟,除非你正在通过套接字,或者你正在用生成的 python 个实例来固定你的内存。
在这种情况下,我建议使用线程而不是 pp
,-- 所以 multiprocessing
库,因为你的函数看起来可能很小。
如果您想要一个为 pp
和 multiprocessing
提供良好抽象的库,这样您就可以挑选并选择为特定作业部署哪个库而无需更改代码,您可以尝试 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
还提供与 MPI
和集群调度程序的连接(上面未显示)。
在此处获取 pathos
:https://github.com/uqfoundation