使用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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)