Python多处理比单一的慢

时间:2018-05-04 14:48:35

标签: python concurrency multiprocessing pypy

Sort.py

height

Parallel.py

imageStyle: {
  flex: 1,
  justifyContent: 'center',
  alignItems: 'center',
  alignSelf: 'stretch',
  backgroundColor: 'transparent',
  height: 200
},

单线程仅耗时2秒,但多处理耗时8秒。

N = 300,000。单线程只需要200秒,但多处理需要1400秒。

为什么使用多处理比单线程慢?

我如何改善表现?

平台:Linux,pypy2.7-5.10.0,4我电脑上的核心

多处理: [多处理图] [https://i.stack.imgur.com/QksXf.png]

单线程: [单线程图] [https://i.stack.imgur.com/9HYw7.png]

2 个答案:

答案 0 :(得分:1)

我希望你已经清楚了解这一点:Pool.apply_async允许你将工作分配给池中的其他进程;它不会自动并行化单个函数。换句话说,两个版本都在单个核心上的单个线程中执行每种排序。并行版本应该将两个排序调用分配给两个核心,但是您要测量每种类型的运行时间,而不是整个程序的执行,因此您不会通过两个重叠来检测任何节省排序调用。 (此外,目前,您的代码不包括池对象的创建,因此我只是假设您使用processes=N来获取 N > 2 - 再说一遍,因为你不是在测量整体运行时而是测量每种运行时的运行时间并不重要。)

(如果没有,请参阅 https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workershttps://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

然而,这并不能解释为什么简单地将工作分派给另一个进程会导致运行时间变慢。 (值得注意的是,在我的MacBook Pro上,简单版本和" parallel"版本之间的执行时间没有区别。)缓慢的原因是进程之间的通信。您要求它通过其IPC渠道转移大型列表,显然效率不高。您可以自己演示:将列表创建和混洗移动到bubble_sort_parallel并将参数设置为pool.apply_async空列表中的提供函数。在我的计算机上,这使得运行时与基本版本相同。

答案 1 :(得分:0)

我已尝试使用N=15000。在我的计算机上它几乎同时工作,也就是说,非并行版本在26秒内对一个数组进行了排序。和并行版本在28秒内对两个数组进行了排序。我设置pool = Pool(2)。您是否尝试过增加N,也许您的结果与您环境中较大的N值相当。

P.S。您还应该记住,产卵过程也需要资源,并且涉及一些同步工具。