如果我有一系列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()
另外,我很想知道如何多线程这样的功能。提前谢谢。
答案 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线程。