numpy与全局解释器锁

38 投票
3 回答
13672 浏览
提问于 2025-04-16 18:45

我准备写一些计算量很大的Python代码,这些代码几乎肯定会大部分时间在numpy的线性代数函数里运行。

现在的问题是,这个任务是属于一种叫做“尴尬的并行”的类型。简单来说,利用这个特性最简单的方法就是使用多个线程。不过,主要的障碍很可能是全局解释器锁(GIL)。

为了帮助设计这个程序,了解哪些numpy操作在执行时可以释放GIL会很有用。因此,我希望能得到一些经验法则、注意事项、建议等等。

顺便提一下,我在Linux上使用的是64位的Python 2.7.1,numpy版本是1.5.1,scipy版本是0.9.0rc2,都是用Intel MKL 10.3.1构建的。

3 个回答

5

“尴尬的并行”?Numpy?听起来很适合用 PyCUDAPyOpenCL 来处理。

8

很多numpy的操作会释放全局解释器锁(GIL),这样它们就可以在多个线程中高效地并行运行(了解更多)。所以你可能不需要做什么特别的事情!

你可以参考这个问题,看看你需要的操作是否属于那些会释放GIL的操作。简单来说,就是在源代码中搜索ALLOW_THREADS或者nogil

(另外,MKL也可以让某些操作使用多个线程,这也是实现并行处理的一个简单方法,尽管可能不是最快的方式)。

6

你可以在官方维基上找到关于NumPy和并行编程的所有问题的答案。

另外,看看这个食谱页面——里面有关于如何用多个线程来使用NumPy的示例代码。

撰写回答