是否可以通过引用将 numpy 数组传递给 cpdef 函数?

Is it possible to pass a numpy array by reference into a cpdef function?

是否可以编写 Cython 函数,其中 numpy 数组 通过引用传递(也许是内存视图?)我可以在 Python 中使用这样的函数吗?

我试过:

cpdef void my_function(bytes line, int& counter, np.ndarray[np.uint32_t, ndim=2]& sums):
    ...
    ...

此处 countersums 将通过引用传递。我对后者感兴趣(但很乐意接受关于两者的批评和建议)。

编译器抛出:

Reference base type cannot be a Python object

我也收到与 cdef 相同的消息,但我不了解问题的全部病因。

是的 - 有点。

Numpy 数组是一个 Python 对象。所有 Python 对象都是“通过引用”传递的(即,如果您在函数内部更改 Numpy 数组的内容,您将在外部更改它)。

所以你就这样做

cpdef void my_function(bytes line, int& counter, np.ndarray[np.uint32_t, ndim=2] sums):

将其指定为 C++ 引用并没有多大意义。对于 Python 对象,Cython 向您隐藏了相当多的细节。


但是,cpdef 函数被设计为可从 Python 和 Cython 调用。 Python 整数(和其他数字类型)。因此,当从 Python 调用时,更改 counter 将不会像您想象的那样工作 ,如果它做了您希望的事情,它可能会破坏解释器。

因此我会避免在 cpdef 函数中使用引用(并且可能大部分情况下完全避免使用 cpdef 函数——通常最好只决定 defcdef )