我需要使用各种大小的2D numpy数组执行大量工作,并希望将这些计算转移到cython中。我的想法是,我的2D numpy数组将从python传递到cython,然后转换为c数组或内存视图,并在一系列其他c级函数中使用以进行计算。
经过一些分析,由于一些严重的python开销,我排除了在cython中使用numpy数组的可能性。使用内存视图速度要快得多,而且非常容易使用,但我认为使用c数组可以进一步提高速度。
这里有个问题 - 如何在cython中声明一个2D c数组,而不预定义其具有设置值的维度?例如,我可以用以下方式从numpy创建一个c数组:
但是它不起作用,编译失败并出现错误“在常量表达式中不允许”。我怀疑我需要以某种方式使用malloc/free?我查看了这个问题(如何在Cython中声明2D列表),但它没有提供我问题的答案。
更新:
事实证明,如果确保在cython中的memory-views关闭了indexError检查,则它们可以像c-arrays一样快,这可以通过使用cython编译器指令来完成:
感谢 @Veedrac 提供的提示!
经过一些分析,由于一些严重的python开销,我排除了在cython中使用numpy数组的可能性。使用内存视图速度要快得多,而且非常容易使用,但我认为使用c数组可以进一步提高速度。
这里有个问题 - 如何在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中的memory-views关闭了indexError检查,则它们可以像c-arrays一样快,这可以通过使用cython编译器指令来完成:
# cython: boundscheck=False
感谢 @Veedrac 提供的提示!