03 Cython 數據類型和語法

Dynamic Type(動態類型)和Static Type(靜態類型)

Cpython中的static和const

靜態類型數據聲明

聲明多個靜態類型變量

Cython指針用法


Dynamic Type(動態類型)和Static Type(靜態類型)

Cpython中的static和const

C語言中的關鍵字static 是用於聲明生命週期貫穿整個程序的變量,但並不是Cython中的關鍵字。

Cython中也沒有const關鍵字,可以將類的成員變量前加一個readonly。

C++、Java和C#都是靜態語言,它們最大的特點就是變量在使用之前都必須進行類型聲明。而Python、JS則是一種動態類型語言,所謂動態,通俗點說就是變量的類型是由最後賦予它的值決定的。
從運行效率來說靜態類型是要優於動態類型的,因爲在編譯的時候就能確定每一個變量的類型,這樣編譯器就能對編譯的結果做一些優化。而動態類型一般都是解釋執行的,變量的類型需要在解釋運行的時候才能確定,難免會損失一點性能。
對於如下的c代碼:

int a = 1;
int b = 2;
int c = a + b;

假設對於+運算符有多種的實現版本(例如有整數版本、浮點數版本、),gcc編譯器在編譯的時候就知道a、b、c一定是整數類型,對於兩個整數的相加那麼編譯器就可以選擇整數版本作爲編譯的結果(雖然我不知道gcc到底有沒有做),那麼在運行的時候就省去了一個判斷的過程。
相對的,對於如下的Python代碼:

a = 1
b = 2
c = a + b

因爲Python是動態類型,變量的類型只有在運行時才能確定其類型,上面的a + b這行代碼在Python中執行時首先要判斷a、b是否屬於同一類型,如果不是因爲Python屬於強類型定義語言那麼就會報TypeError: unsupported operand type(s) for +: 'int' and 'str'類似的錯誤。如果這兩個變量是同一類型(整數),那麼就會通過PyIntObject->PyObject_HEAD->ob_type獲得對應整數類型的類型結構體PyInt_Type,然後再調用PyInt_Type->int_methods->int_add來進行兩個整數的相加。這個過程是如此的”冗長”。

靜態類型數據聲明

在Cython中,無類型動態類型變量使用和Python中的變量用法一樣,不需要指定類型。

而Cython中的靜態類型數據需要使用關鍵字 cdef 來聲明,比如:

cdef int i
cdef int j
cdef float k

聲明多個靜態類型變量:

def integrate(a, b, f):
    cdef:
        int i
        int N=2000
        float dx, s=0.0

Cython指針用法:

cdef double golden_ratio
cdef double *p_double
p_double = &golden_ratio
p_double[0] = 1.618
print golden_ratio
# => 1.618

不能通過 *p_double 來更改指針p_double指向 的變量的值,可以用上面索引(索引爲0)的方式來訪問。

st_t *p_st = make_struct();           (x)
int a_doubled = p_st->a + p_st->a;    (x)

cdef st_t *p_st = make_struct()
cdef int a_doubled = p_st.a + p_st.a

如果指針指向的是結構體的話,那麼不能使用->的方式訪問數據,只能使用.的方式來訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章