用Cython加速Python代码,快到起飞!
點(diǎn)擊??“小詹學(xué)Python”,選擇“星標(biāo)”公眾號
重磅干貨,第一時間送達(dá)
編譯 | sunlei
發(fā)布 | ATYUN訂閱號
本文介紹
如果您曾經(jīng)用Python編寫過代碼,那么等待某些代碼塊執(zhí)行的時間可能比您希望的要長。雖然有一些方法可以提高代碼的效率,但它很可能仍然比C代碼慢。這主要?dú)w結(jié)為一個事實(shí):Python是一種動態(tài)編程語言,它將許多東西移動到C在編譯期間負(fù)責(zé)的運(yùn)行時。
不過,如果您像我一樣喜歡用Python編寫代碼,并且仍然希望加快代碼的速度,那么您可以考慮使用Cython。雖然Cython本身是一種獨(dú)立的編程語言,但是很容易將其融入到您的工作流程中,例如Jupyter Notebook。在執(zhí)行時,Cython將您的Python代碼轉(zhuǎn)換為C,通常會顯著地加快速度。
安裝Cython
為了能夠使用Cython,您需要一個C編譯器。因此,安裝過程會根據(jù)您當(dāng)前的操作系統(tǒng)而有所不同。對于Linux,通常存在GNUC編譯器(gncc)。對于Mac OS,您可以下載Xcode來獲得gncc。如果您應(yīng)該使用Windows,安裝過程會稍微復(fù)雜一些。更多信息請訪問Cython’s GitHub。
一旦你有了C編譯器,你需要在你的終端運(yùn)行的是:
1pip?install?Cython
如何使用Cython
演示Cython功能的最簡單方法是通過Jupyter Notebooks。要在我們的筆記本中使用Cython,我們將使用IPython magic命令。Magic命令以百分號開始,并提供一些額外的功能,這些功能可以增強(qiáng)工作流。通常,有兩種類型的Magic命令:
行magic由單個“%”表示,并且只在一行輸入進(jìn)行操作
單元格magic由兩個“%”表示,并在多行輸入上操作。
讓我們開始:
首先,為了能夠使用Cython,我們必須運(yùn)行:
1%load_ext?Cython
現(xiàn)在,每當(dāng)我們想在代碼單元中運(yùn)行Cython時,我們必須首先將以下magic命令放入單元格:
1%cython
完成這些之后,就可以開始編寫Cython代碼了。
Cython跑得有多快?
與普通Python代碼相比,Cython的速度快多少實(shí)際上取決于代碼本身。例如,如果您正在運(yùn)行具有許多變量的計算開銷較大的循環(huán),Cython將大大優(yōu)于常規(guī)Python代碼。遞歸函數(shù)也會使Cython比Python快很多。
讓我們用斐波那契數(shù)列來證明這一點(diǎn)。簡單地說,這個算法通過把前兩個數(shù)相加找到下一個數(shù)。下面是Python中可能出現(xiàn)的情況:
我們讓Python工作:
如您所見,找到序列中的第39個數(shù)字花費(fèi)了13.3秒。這里的wall time是指從函數(shù)調(diào)用開始到結(jié)束所花費(fèi)的總時間。
讓我們在Cython中定義相同的函數(shù)。
這是怎么回事?正如你所看到的,我們正在使用一些單元魔法,使我們可以在這個單元中使用Cython。我將很快解釋“-a”選項的作用。然后,我們基本上使用與上面相同的代碼,只是現(xiàn)在我們能夠使用靜態(tài)類型聲明并將n定義為integer類型。
正如您所看到的,通過在magic命令后面添加’ -a ‘,我們收到了一些注釋,這些注釋向我們展示了代碼中有多少Python交互。這里的目標(biāo)是去掉所有的黃線,讓它們有一個白色的背景。在這種情況下,將不存在Python交互,所有代碼都將在C中運(yùn)行。您還可以單擊每行旁邊的“+”符號,查看Python代碼的C轉(zhuǎn)換。
這個代碼快了多少?讓我們看看:
本例中,Cython的速度大約是Python的6.75倍。這清楚地展示了利用Cython節(jié)省時間的能力,與常規(guī)Python代碼相比,Cython提供了最大的改進(jìn)。
附加選項
如果您已經(jīng)了解C語言,Cython還允許訪問C代碼,而Cython的創(chuàng)建者還沒有為這些代碼添加現(xiàn)成的聲明。例如,使用以下代碼,可以為C函數(shù)生成Python包裝器并將其添加到模塊dict中。
Cython證明了許多額外的功能,比如并行性,這些功能在文檔中都得到了很好的描述,您可以在這里找到這些功能。
結(jié)論
如果您有時遇到不得不等待太長時間才能執(zhí)行python代碼的問題,那么cython提供了一種非常靈活的集成和高效的方法來加速代碼的執(zhí)行。最重要的是,如果您對C稍微熟悉一點(diǎn),它提供了許多進(jìn)一步優(yōu)化代碼的功能。如果您有任何建議或評論,請隨時與我聯(lián)系。
原文鏈接
https://towardsdatascience.com/speed-up-your-python-code-with-cython-8879105f2b6f
推薦閱讀
誰偷偷刪了你的微信?別慌!Python 幫你都揪出來了
總結(jié)
以上是生活随笔為你收集整理的用Cython加速Python代码,快到起飞!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清华大学「天机」芯片登上Nature封面
- 下一篇: GitHub 标星 5000+!学生党学