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