栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么numpy.mean不是多线程的?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么numpy.mean不是多线程的?

我一直在寻找一些方法来轻松地对我的一些简单分析代码进行多线程处理,因为我注意到numpy仅使用一个内核,尽管事实上它应该是多线程的。

谁说它应该是多线程的?

numpy
主要是为了在单个内核上尽可能快地设计,并且在需要时尽可能并行化。但是您仍然必须并行化它。

特别是,您可以同时对独立的子对象进行操作,并且慢速操作在可能的情况下会释放GIL,尽管“在可能的情况下”可能还远远不够。而且,

numpy
对象被设计为尽可能容易地在进程之间共享或传递,以利于使用
multiprocessing

有一些自动并行化的专用方法,但大多数核心方法却没有。特别是,

dot
在可能的情况下在BLAS之上实现,并且BLAS在大多数平台上会自动并行化,但是
mean
以纯C代码实现。

有关详细信息,请参见使用numpy和scipy并行编程。


因此,您如何知道哪些方法是并行的,哪些不是?而且,在那些不是的情况下,您如何知道哪些可以很好地进行手动线程化,哪些需要进行多处理呢?

没有一个好的答案。您可以进行有根据的猜测(似乎X可能是在ATLAS之上实现的,而我的ATLAS副本是隐式线程化的),或者您可以阅读源代码。

但是通常,最好的办法是尝试并测试。如果代码使用一个内核的100%,另一个内核的0%,请添加手动线程。如果现在使用的是一个内核的100%,另一个内核的10%,并且运行速度几乎不快,请将多线程更改为多处理。(幸运的是,Python使此操作非常容易,特别是如果您使用来自的Executor类

concurrent.futures
或来自的Pool类
multiprocessing
。但是,如果阵列很大,您仍然经常需要考虑一些问题,并测试共享与传递的相对成本。

而且,正如kwatford所指出的,仅仅因为某种方法似乎不是隐式并行的,并不意味着它在下一版numpy,下一版BLAS或另一平台上不会并行。即使在安装了稍微不同的东西的机器上。因此,准备重新测试。然后执行类似的操作

my_mean= numpy.mean
,然后
my_mean
在任何地方使用,因此您只需将一行更改为即可
my_mean = pool_threaded_mean



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/610533.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号