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

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

具有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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5649419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存