【導讀】如果你用過Python,你可能會發現它比想像中運行的慢,尤其是與C語言相比。這主要是因為Python是一種動態程式語言,然而C語言很多操作是在編譯時就完成了。但也不是沒有辦法,Cython可以很好解決你的痛點。
Cython是結合了Python和C的語法的一種語言,可以簡單的認為就是給Python加上了靜態類型後的語法,使用者可以維持大部分的Python語法,而不需要大幅度調整主要的程式邏輯與算法。但由於會直接編譯為二進位程序,所以性能較Python會有很大提升。雖然Cython本身是一種單獨的程式語言,但很容易將其整合到例如Jupyter筆記本工作流程。在執行時,Cython將您的Python代碼轉換為C,通常會大大加快它的速度。
安裝Cython
首先你需要你要C編譯器。對於Linux,通常使用GNU C編譯器(gncc)。對於Mac OS,您可以下載Xcode以獲取gncc。而Windows 桌面系統下安裝C編譯器會更複雜。
有了C編譯器之後,你只需運行:
如何使用Cython
我們將在IPython中演示Cython。
我們首先介紹IPython Magic命令。Magic命令以百分號開頭,通常有2種類型:
首先運行下列語句引入Cython:
然後,當運行Cython代碼時,我們需要加入以下Cython 代碼:
然後就可以愉快地使用Cython了。
Cython的速度有多快?
Cython 主要優化的是循環與遞歸。
讓我們用斐波那契數列來證明這一點。數列中下一個數字是前兩項之和,用如下代碼在Python中實現斐波那契數列:
def fibonacci(n):if n < 0: print("1st fibonacci number = 0")elif n == 1:return 0elif n == 2:return 1else:return fibonacci(n-1) + fibonacci(n-2)使用Python:
如上圖所示,在序列中找到第39個數字需要13.3秒。此處的掛起時間是指從調用該函數開始到結束所用的總時間。
讓我們在Cython中定義相同的函數。
其實只是在第一行加入了
加入「-a」之後,我們可以看出是Python中哪些代碼比較耗時了,加入「%%cython」 之後,這些代碼都將在C語言下運行。你還可以單擊每行旁邊的「+」符號以查看Python代碼的C轉換。
這段代碼有多快?我們來看看:
在這種情況下,Cython比Python快約6.75倍。這清楚地展示了利用Cython節省時間的能力,它提供了比常規Python代碼最大的改進。
其他選項
如果你熟悉C的使用,Cython還允許訪問C代碼,Cython的編寫者尚未添加即用型聲明。例如,使用以下代碼,您可以為C函數生成Python包裝器並將其添加到模塊dict中。
%%cythoncdef extern from "math.h":cpdef double sin(double x)Cython還有許多其他功能,例如並行。
結論
如果您有時遇到不得不等待太長時間才能執行Python代碼的問題,Cython提供了一種非常整齊且高效的方法來加速您的代碼。最重要的是,如果您對C語言稍微熟悉,它提供了許多進一步優化代碼的功能。我絕對建議您仔細查看文檔。
原文連結:
https://towardsdatascience.com/speed-up-your-python-code-with-cython-8879105f2b6f
-END-
專知,專業可信的人工智慧知識分發,讓認知協作更快更好!歡迎登錄www.zhuanzhi.ai,註冊登錄專知,獲取更多AI知識資料!
歡迎微信掃一掃加入專知人工智慧知識星球群,獲取最新AI專業乾貨知識教程視頻資料和與專家交流諮詢!
請加專知小助手微信(掃一掃如下二維碼添加),加入專知人工智慧主題群,諮詢技術商務合作~