這篇“如何用C語(yǔ)言優(yōu)化Python代碼”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“如何用C語(yǔ)言優(yōu)化Python代碼”文章吧。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、湖里網(wǎng)站維護(hù)、網(wǎng)站推廣。
Cython 創(chuàng)建的 C 模塊可以加速 Python 代碼的執(zhí)行,這對(duì)使用效率不高的解釋型語(yǔ)言編寫的復(fù)雜應(yīng)用是很重要的。
Cython 是 Python 編程語(yǔ)言的編譯器,旨在優(yōu)化性能并形成一個(gè)擴(kuò)展的 Cython 編程語(yǔ)言。作為 Python 的擴(kuò)展,Cython 也是 Python 語(yǔ)言的超集,它支持調(diào)用 C 函數(shù)和在變量和類屬性上聲明 C 類型。這使得包裝外部 C 庫(kù)、將 C 嵌入現(xiàn)有應(yīng)用程序或者為 Python 編寫像 Python 一樣簡(jiǎn)單的 C 語(yǔ)言擴(kuò)展語(yǔ)法變得容易。
Cython 一般用于創(chuàng)建 C 模塊來(lái)加速 Python 代碼的執(zhí)行。這在使用解釋型語(yǔ)言編寫的效率不高的復(fù)雜應(yīng)用中非常重要。
你可以在 Linux、BSD、Windows 或 macOS 上安裝 Cython 來(lái)使用 Python:
$ python -m pip install Cython
安裝好后,就可以使用它了。
使用 Cython 的一個(gè)好的方式是從一個(gè)簡(jiǎn)單的 “hello world” 開(kāi)始。這雖然不是展示 Cython 優(yōu)點(diǎn)的最好方式,但是它展示了使用 Cython 時(shí)發(fā)生的情況。
首先,創(chuàng)建一個(gè)簡(jiǎn)單的 Python 腳本,文件命名為 hello.pyx
(.pyx
擴(kuò)展名并不神奇,從技術(shù)上它可以是任何東西,但它是 Cython 的默認(rèn)擴(kuò)展名):
print("hello world")
接下來(lái),創(chuàng)建一個(gè) Python 設(shè)置腳本。一個(gè)像 Python 的 makefile 一樣的 setup.py
,Cython 可以使用它來(lái)處理你的 Python 代碼:
from setuptools import setupfrom Cython.Build import cythonize setup( ext_modules = cythonize("hello.pyx"))
最后,使用 Cython 將你的 Python 腳本轉(zhuǎn)換為 C 代碼:
$ python setup.py build_ext --inplace
你可以在你的工程目錄中看到結(jié)果。Cython 的 cythonize
模塊將 hello.pyx
轉(zhuǎn)換成一個(gè) hello.c
文件和一個(gè) .so
庫(kù)。這些 C 代碼有 2648 行,所以它比一個(gè)一行的 hello.pyx
源碼的文本要多很多。.so
庫(kù)也比它的源碼大 2000 倍(即 54000 字節(jié)和 20 字節(jié)相比)。然后,Python 需要運(yùn)行單個(gè) Python 腳本,所以有很多代碼支持這個(gè)只有一行的 hello.pyx
文件。
要使用 Python 的 “hello world” 腳本的 C 代碼版本,請(qǐng)打開(kāi)一個(gè) Python 提示符并導(dǎo)入你創(chuàng)建的新 hello
模塊:
>>> import hellohello world
測(cè)試計(jì)算能力的一個(gè)很好的通用測(cè)試是計(jì)算質(zhì)數(shù)。質(zhì)數(shù)是一個(gè)比 1 大的正數(shù),且它只有被 1 或它自己除后才會(huì)產(chǎn)生正整數(shù)。雖然理論很簡(jiǎn)單,但是隨著數(shù)的變大,計(jì)算需求也會(huì)增加。在純 Python 中,可以用 10 行以內(nèi)的代碼完成質(zhì)數(shù)的計(jì)算。
import sys number = int(sys.argv[1])if not number <= 1: for i in range(2, number): if (number % i) == 0: print("Not prime") breakelse: print("Integer must be greater than 1")
這個(gè)腳本在成功的時(shí)候是不會(huì)提醒的,如果這個(gè)數(shù)不是質(zhì)數(shù),則返回一條信息:
$ ./prime.py 3$ ./prime.py 4Not prime.
將這些轉(zhuǎn)換為 Cython 需要一些工作,一部分是為了使代碼適合用作庫(kù),另一部分是為了提高性能。
許多用戶將 Python 當(dāng)作一種腳本語(yǔ)言來(lái)學(xué)習(xí):你告訴 Python 想讓它執(zhí)行的步驟,然后它來(lái)做。隨著你對(duì) Python(以及一般的開(kāi)源編程)的了解越多,你可以了解到許多強(qiáng)大的代碼都存在于其他應(yīng)用程序可以利用的庫(kù)中。你的代碼越 不具有針對(duì)性,程序員(包括你)就越可能將其重用于其他的應(yīng)用程序。將計(jì)算和工作流解耦可能需要更多的工作,但最終這通常是值得的。
在這個(gè)簡(jiǎn)單的質(zhì)數(shù)計(jì)算的例子中,將其轉(zhuǎn)換成 Cython,首先是一個(gè)設(shè)置腳本:
from setuptools import setupfrom Cython.Build import cythonize setup( ext_modules = cythonize("prime.py"))
將你的腳本轉(zhuǎn)換成 C:
$ python setup.py build_ext --inplace
到目前為止,一切似乎都工作的很好,但是當(dāng)你試圖導(dǎo)入并使用新模塊時(shí),你會(huì)看到一個(gè)錯(cuò)誤:
>>> import primeTraceback (most recent call last): File "<stdin>", line 1, in <module> File "prime.py", line 2, in init prime number = sys.argv[1]IndexError: list index out of range
這個(gè)問(wèn)題是 Python 腳本希望從一個(gè)終端運(yùn)行,其中參數(shù)(在這個(gè)例子中是要測(cè)試是否為質(zhì)數(shù)的整數(shù))是一樣的。你需要修改你的腳本,使它可以作為一個(gè)庫(kù)來(lái)使用。
庫(kù)不使用系統(tǒng)參數(shù),而是接受其他代碼的參數(shù)。對(duì)于用戶輸入,與其使用 sys.argv
,不如將你的代碼封裝成一個(gè)函數(shù)來(lái)接收一個(gè)叫 number
(或者 num
,或者任何你喜歡的變量名)的參數(shù):
def calculate(number): if not number <= 1: for i in range(2, number): if (number % i) == 0: print("Not prime") break else: print("Integer must be greater than 1")
這確實(shí)使你的腳本有些難以測(cè)試,因?yàn)楫?dāng)你在 Python 中運(yùn)行代碼時(shí),calculate
函數(shù)永遠(yuǎn)不會(huì)被執(zhí)行。但是,Python 編程人員已經(jīng)為這個(gè)問(wèn)題設(shè)計(jì)了一個(gè)通用、還算直觀的解決方案。當(dāng) Python 解釋器執(zhí)行一個(gè) Python 腳本時(shí),有一個(gè)叫 __name__
的特殊變量,這個(gè)變量被設(shè)置為 __main__
,但是當(dāng)它被作為模塊導(dǎo)入的時(shí)候,__name__
被設(shè)置為模塊的名字。利用這點(diǎn),你可以寫一個(gè)既是 Python 模塊又是有效 Python 腳本的庫(kù):
import sys def calculate(number): if not number <= 1: for i in range(2, number): if (number % i) == 0: print("Not prime") break else: print("Integer must be greater than 1") if __name__ == "__main__": number = sys.argv[1] calculate( int(number) )
現(xiàn)在你可以用一個(gè)命令來(lái)運(yùn)行代碼了:
$ python ./prime.py 4Not a prime
你可以將它轉(zhuǎn)換為 Cython 來(lái)用作一個(gè)模塊:
>>> import prime>>> prime.calculate(4)Not prime
用 Cython 將純 Python 的代碼轉(zhuǎn)換為 C 代碼是有用的。這篇文章描述了如何做,然而,Cython 還有功能可以幫助你在轉(zhuǎn)換之前優(yōu)化你的代碼,分析你的代碼來(lái)找到 Cython 什么時(shí)候與 C 進(jìn)行交互,以及更多。如果你正在用 Python,但是你希望用 C 代碼改進(jìn)你的代碼,或者進(jìn)一步理解庫(kù)是如何提供比腳本更好的擴(kuò)展性的,或者你只是好奇 Python 和 C 是如何協(xié)作的,那么就開(kāi)始使用 Cython 吧。
以上就是關(guān)于“如何用C語(yǔ)言優(yōu)化Python代碼”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章名稱:如何用C語(yǔ)言優(yōu)化Python代碼
URL標(biāo)題:http://chinadenli.net/article16/pigcgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、搜索引擎優(yōu)化、Google、定制開(kāi)發(fā)、標(biāo)簽優(yōu)化、App開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)