多线程是否必然会降低运行时间?

时间:2012-09-04 14:29:02

标签: python multithreading numpy

如果我有一系列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()

另外,我很想知道如何多线程这样的功能。提前谢谢。

3 个答案:

答案 0 :(得分:6)

Python具有全局解释器锁(GIL),它只允许一个线程一次与解释器交互 - 实际上,这意味着您一次只能运行一个Python线程。尝试运行多个线程时,这是一个严重的缺点。

然而numpy建立在一个高度优化的数值线性代数库之上,称为LAPACK。如果为系统安装了正确版本的LAPACK,它将为您并行计算。然后,您可以在LAPACK之上安装numpy,并且Python计算将被并行化。

这也意味着许多numpy操作会释放GIL,因此您可以在Python线程中启动长numpy计算并同时执行其他Python。 谢谢@JFSebastian。

答案 1 :(得分:2)

没有。首先,由于全局解释器锁定,CPU绑定程序很少从Python中的线程中受益。

此外,在单核机器上,线程根本不会减少运行时间。

答案 2 :(得分:1)

通常GIL是获得多线程优势的障碍,除非您的python解释器进行计算(例如C实现)。我不确定这是否与numpy有关。

如果你运行的线程不是很多,你应该看看multiprocessing模块。你将有一个单独的系统进程而不是python线程。