Last Updated on 2021-05-17 by Clay
在我們撰寫 Python 程式的時候,寫到後頭,如果程式的規模越來越大,我們會開始嘗試各式各樣『加速』的方法。
通常來講,『多執行緒』、『Cython』都是我們不錯的好選擇。
今天就趁這個機會,紀錄一下使用 Cython 的心得。當然,目前 Cython 在 Ubuntu 之類的作業系統上比較容易使用,聽說 Windows 上的配置會麻煩許多。
如果想要看關於 Cython 的教學,也可以參考以下這個網站: https://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html
Cython 是什麼
Python 是個簡單好用的程式語言,但卻有著『執行速度慢』這樣的缺點。 C 語言雖然執行速度非常快,但卻有著『程式碼冗長』這樣的問題。
而 Cython 這個套件就是為了補足 Python 的這個缺點 —— 將 Python 語法經過修改編譯成 C 語言,然後執行。
這樣一來,我們就可以通過 Python 開發程式,然後擁有著 C 語言的執行速度了!
Cython 使用方法
首先,我們先寫一個簡單的 Fibonacci Python 程式:
import sys def fibo(n): if n == 0: return 0 elif n == 1: return 1 return fibo(n-1) + fibo(n-2) if __name__ == '__main__': print(fibo(int(sys.argv[1])))
然後將其儲存成 fibo.py 後執行看看:
time python3 fibo.py 40
Output:
102334155
real 0m34.126s
user 0m33.875s
sys 0m0.031s
可以看到,我們大約花了 34 秒左右來找到 序列 40 的 Fibonacci 數列解答。
然後,我們將檔案複製一份成為 .pyx 檔。
cp fibo.py fibopyx
安裝 Cython:
sudo pip3 install cython
安裝好之後,寫一個 setup.py 來嘗試將剛才的 Python 程式擴展:
from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize('fibo.pyx') )
使用以下指令執行:
python3 setup.py build_ext --inplace
執行完後,會看到當前目錄底下多出了 build 資料夾、 fibo.c、以及 fibo.cpython-35m-x86_64-linux-gnu.so 等等的檔案。
這時候我們另外再寫一個 Python 檔來呼叫這個模組,我取名叫做 fibo_cython.py:
import sys import fibo print(fibo.fibo(int(sys.argv[1])))
然後這次執行已經使用 Cython 的程式碼:
time python3 fibo_cython.py 40
Output:
102334155
real 0m19.115s
user 0m19.031s
sys 0m0.016s
花了 19 秒!速度很明顯是有提昇的。據說,如果運算量越大的程式,其節省的時間就越多,大家可以盡情地試試看。