Python 多线程必然会减少运行时间吗?

Python 多线程必然会减少运行时间吗?,python,multithreading,numpy,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(

如果我有一系列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()
def空区(A,eps=1e-15):
“”“计算实矩阵A的零空间。”
n、 m=形状(A)
如果n>m:
返回零空间(转置(A),eps)
_,s,vh=linalg.svd(A)
s=附加(s,零(m))[0:m]

null_mask=(sNo)。首先,由于全局解释器锁,CPU绑定程序很少从Python线程中受益


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

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

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


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

通常GIL是获得多线程好处的障碍,除非您正在进行计算我不确定这是否与
numpy
有关


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

你看到了吗?@Katrielex没有,谢谢你的链接。是的,尽管问题是线程是否“必要”减少运行时间;它可能会,也可能会保持不变或增加。您应该明确指出,
numpy
可以释放GIL,因此
numpy
可以使用多个CPU。GIL只防止不同线程同时接触Python对象。它不会阻止它们同时执行。因此计算时间较长从Python调用的C/Fortran中大型矩阵上的s可以并行运行。BLAS也很重要,特别是因为LAPACK通常构建在BLAS之上。