当我试图通过python中的multiprocess.Pool来加速我的程序时,为什么多个进程比单个进程慢?

时间:2015-12-11 05:18:31

标签: python multithreading numpy multiprocessing threadpool

我知道很多人都问过类似的问题。但我找不到任何可以解释现象的东西。这是我的代码。

import time
from multiprocessing import Pool
import numpy as np

def _foo(x):
    np.linalg.inv(x)

if __name__ == '__main__':
    t = time.time()
    r = np.random.rand(1000, 1000)
    p = Pool(2)
    p.map(_foo, [r.copy() for i in range(8)])
    print 'Finished in', time.time() - t, 'sec'

当我使用其他耗时的操作来测试我的代码而不是np.linalg.inv时。它工作正常。随着Pool的大小增加,我确实获得了性能提升。但是,当我在函数np.linalg.inv中使用_foo时,Pool(2)Pool(1)慢得多。 Pool(1)以0.77结束,Pool(2)为9.84。代码在具有6个物理核心的机器上进行测试。

我可以推断的唯一解释是共享一些资源的inv方法。但是我已经为每个进程复制了r。似乎没有必要这样做。

1 个答案:

答案 0 :(得分:0)

我终于明白了。这是Ubuntu上使用openBLAS的numpy“bug”。从Unbuntu 12.04开始,openBLAS变成了多线程。因此,当我开始两个处理以加速我的计算时,实际上有6个物理内核运行24个线程。这是一个典型的开销问题。

我解决它的方法是设置环境变量OPENBLAS_NUM_THREADS = 1。这迫使openBLAS以单线程模式运行。