2017-06-05 21 views
0

我需要paralize功能numpy.linalg.matrix_power我用下面的代码来测试有多少快可并行版本Paralize numpy.linalg.matrix_power不提高性能

def aux_matrix_arg3(A): 

    aaa=np.linalg.matrix_power(np.random.randn(199,199),100)  

return 1 

N=10000 
processes=4 
chunksize=N/processes 
poolWorkers=mp.Pool(processes=processes) 
ti=t.time() 
A=poolWorkers.map(aux_matrix_arg3,range(N),chunksize=chunksize) 
print 't_iteration 3',t.time()-ti 

我曾尝试在我的笔记本电脑中有1个和4个进程。我得到了非常相似的性能 4个过程:t_iteration 3点40.7985408306 1的过程:t_iteration 3 40.6538720131

任何线索,为什么我没有得到与paralle过程任何改良效果?

+3

您应该检查1个进程与4个进程的CPU负载。也许'np.linalg.matrix_power'在内部已经是多进程或多线程的。 – MSeifert

+0

你是对的!它在内部已经是多线程的。 – user2157396

回答

0

的文档说:

对于正整数n,所述功率通过重复矩阵​​squarings和矩阵乘法运算。如果n == 0,则返回与M形状相同的单位矩阵。如果n < 0,则计算逆,然后将其升高到abs(n)。

如果您的系统设置正确,BLAS将用于并行矩阵乘法和LAPACK(也许SuperLU,大概只有在稀疏的情况是后者)求解线性方程组(用来计算反过来)。所以很有可能,你的朴素代码已经非常非常优化了!

尽管如此,你应该小心,因为天真的并行化复制所有数据,这可能会造成伤害。 (通常会使用mmap-arrays来共享数据而不是复制)。