Cython中def,cdef,cpdef的區別

2022-07-31 11:45:09 字數 2741 閱讀 8860

我想知道在我宣告乙個函式時def,cdef,cpdef的區別。

def與其他兩種的區別還算大致清晰。可是有時我見到宣告時新增了返回值,有時見到的宣告卻沒有新增返回值。

我還想知道在cython中如何宣告乙個字串變數,因為我不知道怎麼搞,我就按照宣告物件的方式做了。

def用來在python中宣告乙個函式。因為cython是基於c runtime的,所以允許我們使用cpdef

cdef在c語言層面宣告了函式。正如我們所知道的在c語言中你必須為每乙個函式定義返回值的型別。有事函式返回值為void,這就等於python中的return

python是乙個物件導向的語言。所以我們還可以在c++層面定義類方法,並在子類中重新。

舉個栗子~

cdef class a:

cdef foo(self):

print "a"

cdef class b(a)

cdef foo(self, x=none)

print "b", x

cdef class c(b):

cpdef foo(self, x=true, int k=3)

print "c", x, k

總結一下,為什麼我們要使用def,cdef,cpdef呢?因為我們使用cython,你的python**在編譯之前,會被轉換為c**。鑑於此,我們可以控制會變成c**的那些專案。

更多拓展的資訊我還是建議你去看官方的文件。

最關鍵的不同在於 where the function can be called from,def函式可以被python和cython呼叫,cdef函式可以被cython和c呼叫。

這兩種型別的函式都是既可以被帶型別的變數也可以被不帶型別的變數被宣告,並且都會被cython編譯為c。

# a cython class for illustrative purposes

cdef class c:

pass

def f(int arg1, c arg2, arg3):

# takes an integer, a "c" and an untyped generic python object

pass

cdef g(int arg1, c arg2, arg3):

pass

上面的栗子中,f對python可見(一旦它被imported cython module中。而g不可能被call from python,它將被翻譯成c signature:

pyobject* some_name(int, struct __pyx_obj_11name_of_module_c *, pyobject*)
其中的struct __pyx_obj_11name_of_module_c *是我們的 class c 翻譯成的 c struct。這就允許我們把它傳遞給 c 函式,比如作為乙個函式指標。

相對而言,f就不能輕易的被c呼叫了。

cdef函式不能在我們的函式內定義。這是因為沒有方法可以儲存獲取變數在c函式指標,如下**就是不允許的。

# won't work!

def g(a):

cdef (int b):

return a+b

cdef函式不能處理*args*kwargs型別的變數。這主要是因為它們不能輕易的翻譯成 c signature。

cdef函式可以接受任何型別的變數,包括哪些python中沒有的型別,比如指標。

def函式總是返回乙個python物件,所以不能是乙個具體返回值型別。

cdef int h(int* a):

# specify a return type and take a non-python compatible argument

return a[0]

cdef函式比def函式呼叫更快,因為它們會被翻譯成乙個更加簡單的 c 函式呼叫。

cpdef函式讓cython產生乙個cdef函式(使得從cython進行快速的函式呼叫)和乙個def函式(使得我們可以從pyhton呼叫)。就允許的變數型別而言,cpdef函式具有cdefdef函式的限制。

一旦函式被呼叫,那麼 cdef 和 def 函式內部**的執行速度沒有區別。

因此我們僅在以下條件下使用 cdef 函式:

需要傳遞非python型別

需要傳遞它作為乙個函式指標到c

需要經常呼叫(加速函式呼叫很重要)而且不需要從python呼叫

使用 cpdef 函式的條件:

需要經常呼叫(所以使用加速函式呼叫很重要)而且需要從python呼叫

cython安裝 使用

原創 2012年09月27日 17 25 11 一 cython 在linux ubuntu 下安裝 sudo apt get install cython 安裝後 輸入 cython 即可驗證是否安裝成功 二 使用 1 編寫 以 pyx為副檔名的 cython程式,hello.pyx python...

cython編譯python cython編譯報錯

在使用python呼叫c程式時,可以使用cython庫。背景知識 一 cython是什麼?cython是乙個程式語言,它通過類似python的語法來編寫c擴充套件並可以被python呼叫.既具備了python快速開發的特點,又可以讓 執行起來像c一樣快,同時還可以方便地呼叫c library。二 安...

python擴充套件模組 Cython

python 可以直接呼叫c模組。這些c模組可以是通用的c庫或專門為python工作的庫。cython生成第二種型別的模組 與python內部對話的c庫,可以與現有的python 繫結在一起。通過使用cython可以加速python程式。cython檔案字尾為 pyx 作為新手,我是通過anacon...