-1
也許我正確理解cdef
錯誤地定義了函數定義。例如,假設我想編寫一個函數到Python的列表轉換爲C數組:Cython的`cdef`引發了一個NameError,其中`def`正常工作
%%cython
cimport cython
from libc.stdlib cimport malloc, free
cdef int* list_to_array(a_list):
""" Converts a Python list into a C array """
cdef int *c_array
cdef int count, n
c_array = <int *>malloc(len(a_list)*cython.sizeof(int))
count = len(a_list)
for i in range(count):
c_array[i] = a_list[i]
return c_array
,當我通過
list_to_array([1,2,3])
現在所說的功能,我收到了
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-32-8f3f777d7883> in <module>()
----> 1 list_to_array([1,2,3])
NameError: name 'list_to_array' is not defined
但是,當我使用def
時,可以調用該函數(雖然它不會返回我想要的內容,但它僅用於說明我的問題......)
%%cython
cimport cython
from libc.stdlib cimport malloc, free
def list_to_array1(a_list):
""" Converts a Python list into a C array """
cdef int *c_array
cdef int count, n
c_array = <int *>malloc(len(a_list)*cython.sizeof(int))
count = len(a_list)
for i in range(count):
c_array[i] = a_list[i]
return 1
list_to_array1([1,2,3])
1
當我試圖用cpdef
而不是cdef
,我遇到一個不同的問題:
Error compiling Cython file:
------------------------------------------------------------
...
cimport cython
from libc.stdlib cimport malloc, free
cpdef int* list_to_carray(a_list):
^
------------------------------------------------------------
/Users/sebastian/.ipython/cython/_cython_magic_c979dc7a52cdfb492e901a4b337ed2d2.pyx:3:6: Cannot convert 'int *' to Python object
謝謝,我有第二個函數'array_to_pythonlist',通過'libc.stdlib.free(c_array)'來處理內存泄漏,但我沒有提及它,因爲它不直接關係到問題 – Sebastian
Abp cpdef:我之前嘗試過,並得到'不能將'int *'轉換爲Python對象',我會在上面的問題中發佈完整的錯誤。非常感謝你的幫助! – Sebastian
好的。然而,你是在2副本開銷。如果你傳遞給cython一個numpy數組,你不必複製到/從一個c分配的塊。 – gg349