讓Python提速超過30倍的必殺技:Cython
新智元報道
編輯:鵬飛
【新智元導讀】眾所周知,作為人工智慧界最流行的語言,Python功能強大,但也運行緩慢。如果你的代碼是純Python、或者必須用一個大的for循環並且不能放入矩陣因為數據必須按順序處理的時候,有沒有辦法加速Python呢?本文為你解答。
人工智慧最火的語言,自然是被譽為迄今為止最容易使用的代碼之一的Python。Python代碼素來以直觀、高可讀性著稱。
然而,易用的背後,是Python無法逾越的障礙:慢。尤其是C程序員,這群快槍手簡直無法忍受Python的慢。
所以有人就想了各種方法去解決這個問題,本文就介紹其中的一種。如果你的代碼是純Python,或者你必須用一個大的for循環卻無法放入矩陣因為數據必須按順序處理,那麼就可以使用Cython來加速Python。
什麼是Cython?
根據維基百科:Cython是結合了Python和C的語法的一種語言,可以簡單的認為就是給Python加上了靜態類型後的語法,使用者可以維持大部分的Python語法,而不需要大幅度調整主要的程式邏輯與演算法。但由於會直接編譯為二進位程序,所以性能較Python會有很大提升。
Cython被大量運用在CPython函式庫的撰寫,以取得較高的執行效能。Cython將CPython代碼轉譯成 C 或 C 語法後,自動包裝上函式呼叫界面生成 .pyx 後綴的執行檔,即可當成普通的函式庫。其性能一般遜於原生的 C/C 函式庫,但由於 CPython 語法的易用性可以縮短開發時間。Cython 也可以用於編譯以 C/C 為 CPython 撰寫的函式庫。
目前Cython可以在 Windows, macOS 與 Linux 上使用,可以編譯 2.6, 2.7 與 3.3 至 3.7 版本的 CPython 語法。
我們對Python代碼的唯一調整是向每個變數添加類型信息。通常,我們可以在Python中聲明一個變數,如下所示:
使用Cython,我們將為該變數添加一個類型:
這告訴Cython我們的變數是浮點數,和C一樣。使用純Python,變數的類型是動態確定的。Cython中類型的顯式聲明是可以轉換為C的原因,因為需要顯式類型聲明 。
安裝Cython只需要一行pip:
Cython的類型
使用Cython時,有兩種不同的類型,用於變數和函數。
對於變數,我們有:
請注意所有這些類型都來自C/C !
對於功能:
由此開始,我們要開啟加速了哦!準備好…
使用Cython加速代碼
我們要做的第一件事就是設置Python代碼基準:用於計算數字階乘的for循環。
原始Python代碼如下所示:
Cython相同功能看起來非常相似。確保Cython代碼文件使用 .pyx擴展名。代碼本身的唯一變化是我們需要提前聲明變數和函數的類型,示例代碼如下:
注意函數有一個cpdef來確保我們可以從Python調用它。另外還需要為函數中的所有變數設置類型從而告知C編譯器。
接下來,創建一個setup.py文件,該文件將Cython代碼編譯為C代碼:
並執行編譯:
搞定!我們的C代碼已經編譯好並且可以使用了。
在Cython代碼所在的文件夾中擁有運行C代碼所需的所有文件,包括run_cython.c文件,你盡可以進去仔細看個究竟。
現在,我們要測試全新超快速C代碼了!準備好了嗎?3、2、1、go!
Cython幾乎可以為任何原始Python代碼提供良好的加速,不需要做太多額外的工作。記住,你用的循環越多、處理的數據越多,Cython就越有幫助。
看看下錶,其中顯示了Cython為不同的階乘值提供了多少速度。我們使用Cython獲得了超過36倍的加速!
參考鏈接:
https://towardsdatascience.com/use-cython-to-get-more-than-30x-speedup-on-your-python-code-f6cb337919b6
※鍛造最強機腦!微軟向馬斯克創立的OpenAI投資10億美元研發AGI
※中國人長期「霸榜」GitHub,國外開發者發文控訴
TAG:新智元 |