您正在生成 1000 个进程,这意味着 1000 个 python 实例。对于像你这样的小工作,它会让你慢很多。你不想要pp
这个。更糟糕的是,如果您ppservers
是通过网络(而不是本地进程),那么您不仅有建立套接字连接的开销,而且还有通过网络发送代码以在另一台计算机上生成 python 实例的开销( s)。如果您不想使用套接字和 Internet 连接,则可以pp
通过设置强制仅在本地工作ppservers=()
,(您似乎已经在这样做了)。 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