Skip to content

[Linux] 使用 Cython 加速純 Python 程式

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 秒!速度很明顯是有提昇的。據說,如果運算量越大的程式,其節省的時間就越多,大家可以盡情地試試看。

Tags:

Leave a Reply