是否可以通过引用将 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):
...
...
此处 counter
和 sums
将通过引用传递。我对后者感兴趣(但很乐意接受关于两者的批评和建议)。
编译器抛出:
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
函数——通常最好只决定 def
或 cdef
)
是否可以编写 Cython 函数,其中 numpy 数组 通过引用传递(也许是内存视图?)我可以在 Python 中使用这样的函数吗?
我试过:
cpdef void my_function(bytes line, int& counter, np.ndarray[np.uint32_t, ndim=2]& sums):
...
...
此处 counter
和 sums
将通过引用传递。我对后者感兴趣(但很乐意接受关于两者的批评和建议)。
编译器抛出:
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 整数(和其他数字类型)counter
将不会像您想象的那样工作 ,如果它做了您希望的事情,它可能会破坏解释器。
因此我会避免在 cpdef
函数中使用引用(并且可能大部分情况下完全避免使用 cpdef
函数——通常最好只决定 def
或 cdef
)