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()

另外,我很想知道如何对这样的功能进行多线程处理。提前致谢。

4

3 回答 3

6

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

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

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

于 2012-09-04T14:40:42.590 回答
2

不。一方面,由于全局解释器锁,CPU 密集型程序很少从 Python 中的线程中受益。

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

于 2012-09-04T14:32:06.410 回答
1

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

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

于 2012-09-04T14:53:27.113 回答