全文共2012字,預計學習時長4分鐘html
圖片來源:Unsplash算法
若是你曾經用Python編寫過代碼,可能會發現等待某些代碼塊執行的時間比預期要長。儘管能夠經過一些方法提升其代碼效率,但它的反應速度仍然比C語言慢。這主要歸結於Pyhton是一種動態程序語言,在運行時執行不少任務,而C語言在編譯期間便已經執行。編程
若是你很享受用Python編寫代碼,但又但願能夠提升效率,那麼能夠考慮一下使用Cython。Cython是一種獨立編程語言,能夠很容易地併入相似於Jupyter筆記本之類的工做流之中。在執行過程當中,Cython會將Python代碼轉換爲C語言,從而大大提升其運行速度。bash
安裝Cython微信
使用Cython須要安裝C語言編譯器,所以,安裝過程會根據你當前的操做系統而有所不一樣。對於Linux操做系統,一般須要安裝GNU C語言編譯器(gncc)。對於Mac操做系統,則須要經過下載Xcode來安裝gncc。對於Windows操做系統,安裝程序會稍微有點複雜。app
安裝傳送門:編程語言
Mac:https://developer.apple.com/函數
Windows:file://localhost/C/%5CUsers%5C93954%5CDocuments%5CWeChat%20Files%5CWXYHYSFY_1816%5CFileStorage%5CFile%5C2019-07%5CCython%20GitHub學習
安裝C語言編譯器以後,下面須要的就是在終端運行。優化
如何使用Cython
經過Jupyter筆記本演示Cython的功能是最簡單的方法。要在筆記本中使用Python,須要運用IPython的魔術命令。該命令以百分號開始,提供附加功能用以加強工做流。一般,魔術命令分爲兩種類型:
1. Line Magic以一個%開頭,且僅能做用於一行代碼。
2. Cell Magic以兩個%開頭,能夠做用於多行代碼。
具體流程以下:
首先,爲了啓用Cython,須要執行命令
%load_extCython
每當想要在單元格中運行Cython時,須要先在單元格中輸入下面的魔術命令
%%cython
完成上述操做以後,即可以開始編寫Cython代碼了。
圖片來源:pixabay
Cython能有多快?
Cython能比常規Python代碼快多少實際上取決於代碼自己。例如,若是運行成本較高的多變量循環,Cython明顯優於常規的Python代碼。遞歸函數一樣使得Cython快於Python。
用斐波那契數列來演示一下。簡單來講,這一算法經過將前兩個數相加從而找到下一個數。下面是在Python中示範:
def fibonacci(n):
if n < 0:
print("1st fibonacci number = 0")
elif n == 1:
return 0
elif n == 2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)複製代碼
讓咱們來啓動Python:
能夠看到,找到序列中第39個數用了13.3秒。掛鐘時間在這裏指的是從函數調用開始到結束所需的總時間。
在Cython中定義相同的函數:
那麼發生了什麼呢?能夠看到,在頂端執行cell magic命令,從而使得Cython能夠應用於這個單元格。我將簡要介紹「-a」的做用,接着,使用與以前基本同樣的代碼。惟一的不一樣之處在於此處可使用靜態類型聲明,並將n定義爲整數。
能夠看到,經過在魔術命令後添加「-a」,可以接收到一些標註,這些標註反映了代碼中有多少Python交互。這一代碼的目的在於去掉全部黃線並加上白色背景,於是此處不存在Python交互,全部代碼都在C語言中執行。你還能夠單擊每行旁邊的「+」查看Python代碼的C語言翻譯。
這一代碼能有多快呢?咱們一塊兒看看:
在本例中,Cython的速度大約是Python的6.75倍,這清楚地展現了Cython可以大大節約時間。這一點也是Cython相比於Python最大的改進之處。
附加選項
若是你對C語言已經有所瞭解,Cython還容許訪問C代碼,而Cython的建立者尚未爲這些代碼添加現成的聲明。那麼,使用如下代碼能夠爲C函數生成Python包裝器並將其添加到模塊dict中。
%%cython
cdef extern from "math.h":
cpdef double sin(double x)複製代碼
Cython證實了並行性等許多額外的功能。
傳送門:http://docs.cython.org/en/latest/index.html
總之,若是你遇到在執行Python代碼時等待時間過長的問題,Cython能夠提供一種集成而高效的方法來加速代碼執行速度。更重要的是,若是你熟悉C語言,就可使用Cython許多進一步優化代碼的功能。
留言 點贊 關注
咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」
(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)