【问题标题】:Will multi-threading necessarily decrease runtime?多线程必然会减少运行时间吗?
【发布时间】:2012-09-04 14:29:02
【问题描述】:

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

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

【问题讨论】:

标签: python multithreading numpy


【解决方案1】:

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

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

这也意味着许多numpy 操作会释放 GIL,这样您就可以在 Python 线程中触发长时间的 numpy 计算并同时执行其他 Python。 感谢@JFSebastian。

【讨论】:

  • 你应该明确提到numpy 可以释放 GIL,因此numpy 可以使用多个 CPU。 GIL 只防止不同线程同时接触 Python 对象。它不会阻止他们同时执行。因此,从 Python 调用的 C/Fortran 中大型矩阵的长时间计算可以并行运行。
  • BLAS 也很重要,尤其是因为 LAPACK 通常建立在 BLAS 之上。
【解决方案2】:

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

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

【讨论】:

  • 是的,尽管问题是线程是否会“必然”减少运行时间;它可能会,也可能会保持不变或增加。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2020-08-11
    • 2018-02-27
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2017-12-30
    • 2020-06-13
    相关资源
    最近更新 更多