使用Cython為Python編寫更快的C擴(kuò)展
使用Python很有趣,但有時(shí),用它編寫的程序可能很慢。所有的運(yùn)行時(shí)動態(tài)調(diào)度會帶來很大的代價(jià):有時(shí)它比用C或Rust等系統(tǒng)語言編寫的等效代碼慢10倍。
將代碼遷移到一種全新的語言可能會在成本和可靠性方面付出巨大代價(jià):所有的手工重寫工作都將不可避免地引入錯(cuò)誤。我們可以兩者兼得么?
為了練習(xí)一下優(yōu)化,我們需要一些慢代碼。有什么比斐波那契數(shù)列的意外指數(shù)實(shí)現(xiàn)更慢?
deffib(n):
ifn<2:
return1
returnfib(n-1)+fib(n-2)
由于對fib的調(diào)用會導(dǎo)致兩次再次調(diào)用,因此這種效率極低的算法需要很長時(shí)間才能執(zhí)行。例如,在我的新筆記本電腦上,fib(36)需要大約4.5秒。這個(gè)4.5秒會成為我們探索Python的Cython擴(kuò)展能提供的幫助的基準(zhǔn)。
使用Cython的正確方法是將其集成到setup.py中。然而,使用pyximport可以快速地進(jìn)行嘗試。讓我們將fib代碼放在fib.pyx中并使用Cython運(yùn)行它。
>>>importpyximport;pyximport.install()
>>>importfib
>>>fib.fib(36)
只使用Cython而不修改代碼,這個(gè)算法在我筆記本上花費(fèi)的時(shí)間減少到大約2.5秒。幾乎無需任何努力,這幾乎減少了50%的運(yùn)行時(shí)間。當(dāng)然,得到了一個(gè)不錯(cuò)的成果。
加把勁,我們可以讓它變得更快。
cpdefintfib(intn):
ifn<2:
return1
returnfib(n-1)+fib(n-2)
我們將fib中的代碼變成用cpdef定義的函數(shù),并添加了兩個(gè)類型注釋:它接受一個(gè)整數(shù)并返回一個(gè)整數(shù)。
這個(gè)變得快多了,大約只用了0.05秒。它是如此之快,以至于我可能開始懷疑我的測量方法包含噪聲:之前,這種噪聲在信號中丟失了。
當(dāng)下次你的Python代碼花費(fèi)太多CPU時(shí)間時(shí),也許會導(dǎo)致風(fēng)扇狂轉(zhuǎn),為何不看看Cython是否可以解決問題呢?
以上內(nèi)容為大家介紹了使用Cython為Python編寫更快的C擴(kuò)展,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://www.mobiletrain.org/

猜你喜歡LIKE
相關(guān)推薦HOT
更多>>
pythonfor循環(huán)是什么
pythonfor循環(huán)是什么在做遍歷的時(shí)候,對于一些數(shù)據(jù)的反復(fù)循環(huán)執(zhí)行,我們會用到for循環(huán)的語句。可以說這是新手入門必學(xué)的語句之一,在很多基礎(chǔ)循...詳情>>
2023-11-13 07:46:36
pythoncontextmanager()的轉(zhuǎn)換
python中contextmanager()的轉(zhuǎn)換1、說明當(dāng)發(fā)出請求時(shí),requests庫會在將請求實(shí)際發(fā)送到目標(biāo)服務(wù)器之前準(zhǔn)備該請求。請求準(zhǔn)備包括像驗(yàn)證頭信息和...詳情>>
2023-11-13 06:34:35
python使用items()遍歷鍵值對
python使用items()遍歷鍵值對字典可以用來存儲各種方式的信息,所以有很多方式可以通過字典的所有鍵值對、鍵或值。說明1、即使通過字典,鍵值對...詳情>>
2023-11-13 04:24:15
python實(shí)例方法中self的作用
python實(shí)例方法中self的作用說明1、無論是創(chuàng)建類的構(gòu)造方法還是實(shí)例方法,最少要包含一個(gè)參數(shù)self。2、通過實(shí)例的self參數(shù)與對象進(jìn)行綁定,程序...詳情>>
2023-11-13 03:46:48熱門推薦
python實(shí)現(xiàn)WSGI的框架
沸pythonfor循環(huán)是什么
熱python-=是什么意思
熱python打開文本文件有哪些方法?
新pythoncontextmanager()的轉(zhuǎn)換
pythonre是什么?
pythondecimal是什么
python列表追加元素出錯(cuò)的解決
python使用loguru操作日志
python使用items()遍歷鍵值對
pythonvim中有哪些對象
python實(shí)例方法中self的作用
pythonin和is的區(qū)分
pythonos.path.join()函數(shù)的使用
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點(diǎn)擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費(fèi)用
了解課程價(jià)格 -
優(yōu)惠活動
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊(duì)
了解師資團(tuán)隊(duì) -
實(shí)戰(zhàn)項(xiàng)目
獲取項(xiàng)目源碼 -
開班地區(qū)
查看來校路線