2017-06-05 122 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來共享數據而不是複製)。