我有一些Cython代码,希望能以最快的速度运行。为了实现这个目标,我需要释放GIL吗?
假设我的代码类似于以下示例:
import numpy as np
# trivial definition just for illustration!
cdef double some_complicated_function(double x) nogil:
return x
cdef void func(double[:] input) nogil:
cdef double[:] array = np.zeros_like(input)
for i in range(array.shape[0]):
array[i] = some_complicated_function(input[i])
我从 np.zeros_like
这一行代码中得到了一堆类似于以下的错误消息:
nogilcode.pyx:7:40: Calling gil-requiring function not allowed without gil
nogilcode.pyx:7:29: Accessing Python attribute not allowed without gil
nogilcode.pyx:7:27: Accessing Python global or builtin not allowed without gil
nogilcode.pyx:7:40: Constructing Python tuple not allowed without gil
nogilcode.pyx:7:41: Converting to Python object not allowed without gil
我需要找到一种不需要GIL的调用
np.zeros_like
或其他方式来分配数组的方法吗?
zeros_like
函数,这样做可以稍微提高一些速度。由于你填充了每个值,所以可以创建一个empty
数组而不是一个zeros
数组。 - MaxNoenp.zeros_like
具体。许多人似乎从一开始就认为所有东西都需要nogil
,而没有真正的理由,我想写一个好的答案来参考他们。 - DavidWcdef
函数内使用np.sum(a_mem_view)
可能不会释放GIL。DavidW,你真是一个英雄,解决了这么多cython问题,干得好! - avocado