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

具有numpy数组和共享内存的并行python循环

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

具有numpy数组和共享内存的并行python循环

使用Cython并行支持:

# asd.pyxfrom cython.parallel cimport prangeimport numpy as npdef foo():    cdef int i, j, n    x = np.zeros((200, 2000), float)    n = x.shape[0]    for i in prange(n, nogil=True):        with gil: for j in range(100):     x[i,:] = np.cos(x[i,:])    return x

在2核计算机上:

$ cython asd.pyx$ gcc -fPIC -fopenmp -shared -o asd.so asd.c -I/usr/include/python2.7$ export OMP_NUM_THREADS=1$ time python -c 'import asd; asd.foo()'real    0m1.548suser    0m1.442ssys 0m0.061s$ export OMP_NUM_THREADS=2$ time python -c 'import asd; asd.foo()'real    0m0.602suser    0m0.826ssys 0m0.075s

由于

np.cos
(像其他ufuncs一样)释放了GIL ,因此这可以并行运行。

如果要交互使用此功能:

# asd.pyxbdldef make_ext(modname, pyxfilename):    from distutils.extension import Extension    return Extension(name=modname,          sources=[pyxfilename],          extra_link_args=['-fopenmp'],          extra_compile_args=['-fopenmp'])

和(删除

asd.so
asd.c
首先):

>>> import pyximport>>> pyximport.install(reload_support=True)>>> import asd>>> q1 = asd.foo()# Go to an editor and change asd.pyx>>> reload(asd)>>> q2 = asd.foo()

所以是的,在某些情况下,您可以仅使用线程来并行化。OpenMP只是线程的一个高级包装器,因此,此处只需要Cython即可获得更简单的语法。没有Cython,您可以使用

threading
模块
—与多处理类似(并且可能更健壮),但是您无需执行任何特殊操作即可将数组声明为共享内存。

但是,并非所有操作都会释放GIL,因此YMMV会提高性能。

***

从其他Stackoverflow答案中刮取的另一个可能有用的链接—
另一个指向多处理的接口:http :
//packages.python.org/joblib/parallel.html



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

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

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