此处显示的代码经过简化,但会触发相同的 PicklingError。我知道关于什么可以腌制和什么不能腌制有很多讨论,但我确实从他们那里找到了解决方案。
我编写了一个简单的 cython 脚本,具有以下功能:
def pow2(int a) :
return a**2
编译工作正常,我可以在 python 脚本中调用这个函数。
但是,我想知道如何在多处理中使用此功能,
from multiprocessing import Pool
from fast import pow2
p = Pool(processes =4 )
y = p.map( pow2, np.arange( 10, dtype=int))
gives me an PicklingError:
dtw 是包的名称,fast 是 fast.pyx。
我该如何解决这个问题?
提前致谢
而不是使用multiprocessing
,这意味着由于酸洗过程而将数据写入磁盘,您可以使用 OpenMP 包装器prange
。在您的情况下,您可以如下所示使用它。
- 注意使用
x*x
代替x**2
,避免函数调用pow(x, 2)
):
- 数组的一部分被传递给每个线程,使用
double
指针
- 当最后一个线程获取更多值时
size % num_threads != 0
Code:
#cython: wraparound=False
#cython: boundscheck=False
#cython: cdivision=True
#cython: nonecheck=False
#cython: profile=False
import numpy as np
cimport numpy as np
from cython.parallel import prange
cdef void cpow2(int size, double *inp, double *out) nogil:
cdef int i
for i in range(size):
out[i] = inp[i]*inp[i]
def pow2(np.ndarray[np.float64_t, ndim=1] inp,
np.ndarray[np.float64_t, ndim=1] out,
int num_threads=4):
cdef int thread
cdef np.ndarray[np.int32_t, ndim=1] sub_sizes, pos
size = np.shape(inp)[0]
sub_sizes = np.zeros(num_threads, np.int32) + size//num_threads
pos = np.zeros(num_threads, np.int32)
sub_sizes[num_threads-1] += size % num_threads
pos[1:] = np.cumsum(sub_sizes)[:num_threads-1]
for thread in prange(num_threads, nogil=True, chunksize=1,
num_threads=num_threads, schedule='static'):
cpow2(sub_sizes[thread], &inp[pos[thread]], &out[pos[thread]])
def main():
a = np.arange(642312323).astype(np.float64)
pow2(a, out=a, num_threads=4)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)