我想知道在我宣告乙個函式時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
函式具有cdef
和def
函式的限制。
一旦函式被呼叫,那麼 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...