我需要使用各种大小的 2D numpy 数组执行大量工作,并且我想将这些计算卸载到 cython 上。这个想法是,我的 2D numpy 数组将从 python 传递到 cython,在那里它将被转换为 c 数组或内存视图,并在其他 c 级函数的级联中使用来进行计算。
经过一些分析后,由于一些严重的 python 开销,我排除了在 cython 中使用 numpy 数组。使用内存视图要快得多并且非常容易使用,但我怀疑我可以通过使用 c-arrays 来获得更多的加速。
不过,这是我的问题 - 如何在 cython 中声明 2D c 数组而不用设定值预定义其尺寸?例如,我可以通过这种方式从 numpy 创建一个 c 数组:
narr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]], dtype=np.dtype("i"))
cdef int c_arr[3][4]:
for i in range(3):
for j in range(4):
c_arr[i][j] = narr[i][j]
然后将其传递给函数:
cdef void somefunction(int c_Arr[3][4]):
...
但这意味着我有一个固定大小的数组,在我的情况下这将是无用的。所以我尝试了这样的事情:
narr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]], dtype=np.dtype("i"))
cdef int a = np.shape(narr)[0]
cdef int b = np.shape(narr)[1]
cdef int c_arr[a][b]: # INCORRECT - EXAMPLE ONLY
for i in range(a):
for j in range(b):
c_arr[i][j] = narr[i][j]
打算将其传递给这样的函数:
cdef void somefunction(int a, int b, int c_Arr[a][b]):
...
但它不起作用,编译失败并出现错误“不允许在常量表达式中”。我怀疑我不需要以某种方式使用 malloc/free 吗?我看过这个问题(如何在 Cython 中声明 2D 列表),但它没有为我的问题提供答案。
更新:
事实证明,如果确保为内存视图关闭 cython 中的 indexError 检查,则内存视图可以与 c 数组一样快,这可以通过使用 cython 编译器指令来完成:
# cython: boundscheck=False
感谢@Veedrac 的提示!