首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么numpy计算不受全局解释器锁的影响?

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

Stack Overflow用户
提问于 2016-04-07 14:24:39
回答 1查看 4.9K关注 0票数 18

我正试图决定是否应该使用多处理或线程处理,并且我已经了解了一些关于全局解释器锁的有趣的信息。在这个不错的博客帖子中,多线程似乎不适合繁忙的任务。但是,我也了解到一些功能(如I/O或numpy )不受GIL的影响。

有人能解释一下为什么吗?我怎样才能知道我的代码(可能很重)是否适合多线程呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-07 15:37:09

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

在不需要Python解释器(例如C库)的代码中,可以专门发布GIL --允许依赖于解释器的其他代码继续运行。在Numpy C代码库中,宏NPY_BEGIN_THREADSNPY_END_THREADS用于分隔允许GIL发布的代码块。您可以在对numpy源的搜索中看到这些。

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

大多数核心函数都发布GIL --例如通用功能(ufunc)这样做,如所述

只要不涉及对象数组,在调用循环之前就会释放PythonGlobal解释器锁(GIL)。如果有必要,将重新获取以处理错误条件。

关于您自己的代码,可获得NumPy的源代码。检查您为上述宏使用的函数(以及它们调用的函数)。还要注意的是,性能的好处在很大程度上取决于GIL发布的时间--如果您的代码不断地在Python中出现/退出,您将不会看到多少改进。

另一种选择是直接测试它。但是,请记住,使用条件GIL宏的函数在小数组和大数组中可能表现出不同的行为。因此,使用小数据集的测试可能不能准确地表示较大任务的性能。

还有一些关于使用numpy可用关于官方维基的并行处理的其他信息,以及关于Python的有用文章(一般为在Programmers.SE上 )。

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36479159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档