未分類

四月 Taipei.py / Cython 手把手教學

從去年開始就一直有在參加Taipei.py

不過一直以來聽的都是在場Programmer 專業的分享 當然收獲有是有

不過仍然感到非常的硬 原因在於他們分享的東西沒有玩過 當然容易聽不懂

自從上次第一次 Pandas手把手教學 再接這次的Cython手把手教學

真的越來越感覺Taipei.py 對初學的人相常友善~ :)

我也感覺自己滿幸運的 當自己有想學的東西都會剛好有人要分享、教學(樂)

不管是上次的Pandas 或 這次的Cython 居然可以從頭到尾聽得懂~ 跟著做XD

對我來說也是相當大的鼓舞 以後提及Python加速 或者 資料分析應該就不會太陌生了~

什麼是Cython!? 你可以把它想成是 Cython = C + Python

或者是乾脆把Cython想成是一個新的語言也行

為什麼要這麼做? 原因沒有別的~ 腳本語言最大的缺點就是速度會比靜態語言慢上許多

尤其是像Python越來越被用在科學運算做處理 當然對於速度上的需求就越大

之前的Taipei.py就有人說 我可以用Python寫出和C一樣快的程式 這種酷酷的發言XD

他就介紹了Cython,今天終於有機會聽到Mosky帶著大家體驗這個驚人的套件~

一般Python在import 套件的時候都的.py檔

但其實只要符合Python所訂的規則,其它檔案也都可以import 給Python去做使用

此外Cython會比Python快的原因之一也是經由轉成.c檔再做編譯

當然比起Python的直譯器快 Cython編譯完的.so (share object)

就可以給Python import使用了

Cython在寫的使用其實仍保持著像Python的彈性 也因此可以與Python的檔案做相容

除此之外像是一些變數或function的宣告就有分像 CDEF CPDEF 及Python原本的DEF

cdef int i,j,k
cdef float f, g[42], *h

後面基本上就和你一般寫c宣告的方式一樣XD 當然像enum struct 也都可以這麼做    

Cython的檔案為 .pyx 所以一般是寫在裡頭

那這三種的差別到底在哪? 為什麼有這些東西出現?

CDEF和原本的DEF相比 CDEF是僅用來給C去做轉換編譯的

此外Python 不是用import 而是cimport 去做載入 並且僅能執行

CDEF並不提供給Python像DEF做function的呼叫

繼承至C所以在用CDEF的時面 還必須要創一個.pxd 檔做介面的宣告

這點稍為麻煩了一些XD 

而CPDEF 和 CDEF的差別 可以想成是CDF包了一層Python

這樣就可以讓Python去做function的呼叫了,為此所付出的代價就是速度較慢

這邊附上了Mosky附上了比較表 對 這堂Cython有興趣的可以到 mosky.tw 找投影片~

速度是越上面速度就越快,反正則越慢

我們可以發現DEF在最下面是速度最慢的一個

再來就是CPDEF犧牲了一點速度換來Python呼叫的便利性

排第二的就是我們自己寫的CDEF 相對的就不方便許多

最快的理所當然就是直接用Cython去取用C原的函式庫 使用方式一樣是用cimport

所以我們可以發現Cython加速的方式就是去犧牲Python的韌性來換取速度

我記得像是多了形態和陣列大小的宣告就能夠大幅提升原本的效能

而我們也可以透過Cython找到Python的便利性與速度的平衡

不但可以讓原始碼非常簡潔,同樣的也有一定的效能,這是多神奇的一件事啊!


做了非常扎實的綀習 超棒!! Cython給人的印象深刻!!

在這堂也發現了檔案的命名管理真的超級重要 .pyx .pxd .py 三個互相做取用

如果隨便命名 光是該import哪些就相當惱人了吧XD

期待下一次的Taipei.py 不過在那之前的五月中會有更大的聚會

5/17 PyCon2014 Apac 期待會有更多收獲與心得~

分享到