2012-09-04 20 views
3

如果我有一系列的CPU密集型操作,我的程序多線程必然會減少它的運行時間?這樣做的權衡是什麼?在這種情況下,我試圖計算一個非常大的矩陣的零空間。我使用Python和,具體而言,numpy的包:多線程是否會降低運行時間?

def nullspace(A, eps=1e-15): 
    """Computes the null space of the real matrix A.""" 
    n, m = shape(A) 
    if n > m : 
     return nullspace(transpose(A), eps) 
    _, s, vh = linalg.svd(A) 
    s = append(s, zeros(m))[0:m] 
    null_mask = (s <= eps) 
    null_space = compress(null_mask, vh, axis=0) 
    return null_space.tolist() 

另外,我很想知道剛纔怎麼一個會去多線程這樣的功能。提前致謝。

+2

你見過http://www.scipy.org/ParallelProgramming嗎? – katrielalex

+0

@katrielalex不,我沒有,謝謝你的鏈接。 – arshajii

回答

6

Python擁有全局解釋器鎖(Global Interpreter Lock,GIL),它一次只允許一個線程與解釋器交互 - 實際上,這意味着您一次只能運行一個Python線程。嘗試運行多個線程時,這是一個嚴重的缺點。

但是,numpy構建在一個大量優化的數值線性代數庫LAPACK的基礎之上。如果你爲你的系統安裝了正確版本的LAPACK,它將爲你的計算並行化。然後,您可以在您的LAPACK上安裝numpy,並且Python計算將會並行化。

這也意味着很多numpy操作釋放GIL,因此您可以在Python線程中啓動長計算並同時執行其他Python。 謝謝@JFSebastian。

+4

你應該明確提到'numpy'可以釋放GIL,因此'numpy'可以使用多個CPU。 GIL只能防止不同線程同時觸摸* Python對象*。它並不妨礙他們同時執行。因此,從Python調用的C/Fortran中大型矩陣的長計算可以並行運行。 – jfs

+0

完成,謝謝=) – katrielalex

+0

BLAS也很重要,特別是因爲LAPACK通常建立在BLAS之上。 – Rufflewind

2

否。一方面,由於全局解釋器鎖定,CPU限制程序很少從Python中的線程獲益。

另外,在單核機器上,線程不會減少運行時間。

+1

'numpy'代碼通常會釋放GIL。 – katrielalex

+1

誠然,問題是線程是否會「必然」減少運行時間;它可能,或者可能保持不變或增加。 – geoffspear

1

通常GIL是獲得多線程優勢的障礙,除非您的計算是由您的Python解釋器(例如C實現)完成的。我不確定這是否與numpy有關。

如果你運行的線程太少,你應該看看multiprocessing模塊。你將有一個單獨的系統進程而不是python線程。

相關問題