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

导入scipy破坏了Python中的多处理支持

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

导入scipy破坏了Python中的多处理支持

在深入研究并将问题发布在Scipy
GitHub网站上之后,我找到了解决方案。

在我开始之前,这是记录非常好这里-我只是给出一个概述。

这个问题
涉及到SciPy的版本,或numpy的,我用。它起源于Numpy和Scipy用于各种线性代数例程的系统BLAS库。您可以通过运行来确定Numpy链接到哪些库

python -c 'import numpy; numpy.show_config()'

如果在Linux中使用OpenBLAS,则可能会发现CPU关联性设置为1,这意味着一旦这些算法以Python(通过Numpy /
Scipy)导入了Python,则最多可以访问CPU的一个核心。要测试这一点,请在Python终端中运行

import osos.system('taskset -p %s' %os.getpid())

如果CPU亲和力返回

f
ff
,您可以访问多个内核。就我而言,它是这样开始的,但是在导入numpy或scipy.any_module时,它将切换到
1
,因此是我的问题。

我找到了两种解决方案:

更改CPU关联

您可以在main函数的顶部手动设置主进程的CPU亲和力,以使代码如下所示:

import multiprocessingimport numpy as npimport mathimport timeimport osdef compute_something(t):    a = 0.    for i in range(10000000):        a = math.sqrt(t)    return aif __name__ == '__main__':    pool_size = multiprocessing.cpu_count()    os.system('taskset -cp 0-%d %s' % (pool_size, os.getpid()))    print "Pool size:", pool_size    pool = multiprocessing.Pool(processes=pool_size)    inputs = range(10)    tic = time.time()    builtin_outputs = map(compute_something, inputs)    print 'Built-in:', time.time() - tic    tic = time.time()    pool_outputs = pool.map(compute_something, inputs)    print 'Pool    :', time.time() - tic

请注意,选择一个高于内核数的值

taskset
似乎无关紧要-它仅使用最大可能数。

切换BLAS库

解决方案记录在上面链接的站点上。基本上:安装libatlas,然后

update-alternatives
将numpy指向ATLAS,而不是OpenBLAS。



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

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

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