2012-09-04 21 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线程。

相关问题