python - 为什么 numpy 计算不受全局解释器锁的影响?

标签 python multithreading numpy multiprocessing gil

我正在尝试决定是应该使用多处理还是线程,并且我已经了解了一些关于 Global Interpreter Lock 的有趣信息。 .在这个不错blog post ,似乎多线程不适合繁忙的任务。但是,我还了解到某些功能(例如 I/O 或 numpy)不受 GIL 的影响。

谁能解释为什么,以及我如何才能确定我的(可能相当 numpy-heavy)代码是否适合多线程?

最佳答案

许多 numpy 计算不受 GIL 的影响,但不是全部。

虽然在不需要 Python 解释器的代码(例如 C 库)中,可以专门释放 GIL - 允许依赖于解释器的其他代码继续运行。在 Numpy C 代码库中,宏 NPY_BEGIN_THREADSNPY_END_THREADS 用于分隔允许 GIL 释放的代码块。您可以在 this search of the numpy source 中看到这些.

NumPy C API documentation有更多关于线程支持的信息。请注意附加宏 NPY_BEGIN_THREADS_DESCRNPY_END_THREADS_DESCRNPY_BEGIN_THREADS_THRESHOLDED,它们处理有条件的 GIL 释放,具体取决于数组 dtypes 和大小的循环。

大多数核心功能都发布了 GIL - 例如 Universal Functions (ufunc)这样做 as described :

as long as no object arrays are involved, the Python Global Interpreter Lock (GIL) is released prior to calling the loops. It is re-acquired if necessary to handle error conditions.

关于您自己的代码,source code for NumPy is available .检查您为上述宏使用的函数(以及它们调用的函数)。另请注意,性能优势在很大程度上取决于 GIL 发布的多长时间 - 如果您的代码不断地进入/退出 Python,您将看不到太多改进。

另一种选择是测试它。但是,请记住,使用条件 GIL 宏的函数可能会对小型和大型数组表现出不同的行为。因此,使用小型数据集进行的测试可能无法准确表示大型任务的性能。

有一些关于使用 numpy 进行并行处理的额外信息 on the official wiki和一篇关于 Python GIL 的有用帖子 over on Programmers.SE .

关于python - 为什么 numpy 计算不受全局解释器锁的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36479159/

相关文章:

python - 更改线条颜色

java线程同步问题,如何实现observable线程

c# - 让所有线程休眠

python - 如何在 Python 中应用分段线性拟合?

python - 两个for循环的优化

python - 为什么 Mac OS X python 与 CentOS Linux python 对字符串中的\U 转义有不同的解释?

python - 将缺失值保留为 'NaN' 的 LabelEncoder

Java嵌套同步

python - 将 sympy 表达式转换为 numpy 数组的函数

python - test_size=0 的 train_test_split 对数据有何影响?