溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言優(yōu)化Python代碼的方法是什么

發(fā)布時間:2022-10-18 15:11:31 來源:億速云 閱讀:131 作者:iii 欄目:編程語言

這篇文章主要介紹了C語言優(yōu)化Python代碼的方法是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C語言優(yōu)化Python代碼的方法是什么文章都會有所收獲,下面我們一起來看看吧。


Cython 創(chuàng)建的 C 模塊可以加速 Python 代碼的執(zhí)行,這對使用效率不高的解釋型語言編寫的復雜應用是很重要的。

Cython 是 Python 編程語言的編譯器,旨在優(yōu)化性能并形成一個擴展的 Cython 編程語言。作為 Python 的擴展,Cython 也是 Python 語言的超集,它支持調用 C 函數和在變量和類屬性上聲明 C 類型。這使得包裝外部 C 庫、將 C 嵌入現有應用程序或者為 Python 編寫像 Python 一樣簡單的 C 語言擴展語法變得容易。

Cython 一般用于創(chuàng)建 C 模塊來加速 Python 代碼的執(zhí)行。這在使用解釋型語言編寫的效率不高的復雜應用中非常重要。

安裝 Cython

你可以在 Linux、BSD、Windows 或 macOS 上安裝 Cython 來使用 Python:

$ python -m pip install Cython

安裝好后,就可以使用它了。

將 Python 轉換成 C

使用 Cython 的一個好的方式是從一個簡單的 “hello world” 開始。這雖然不是展示 Cython 優(yōu)點的最好方式,但是它展示了使用 Cython 時發(fā)生的情況。

首先,創(chuàng)建一個簡單的 Python 腳本,文件命名為 hello.pyx.pyx 擴展名并不神奇,從技術上它可以是任何東西,但它是 Cython 的默認擴展名):

print("hello world")

接下來,創(chuàng)建一個 Python 設置腳本。一個像 Python 的 makefile 一樣的 setup.py,Cython 可以使用它來處理你的 Python 代碼:

from setuptools import setupfrom Cython.Build import cythonize setup(    ext_modules = cythonize("hello.pyx"))

最后,使用 Cython 將你的 Python 腳本轉換為 C 代碼:

$ python setup.py build_ext --inplace

你可以在你的工程目錄中看到結果。Cython 的 cythonize 模塊將 hello.pyx 轉換成一個 hello.c 文件和一個 .so 庫。這些 C 代碼有 2648 行,所以它比一個一行的 hello.pyx 源碼的文本要多很多。.so 庫也比它的源碼大 2000 倍(即 54000 字節(jié)和 20 字節(jié)相比)。然后,Python 需要運行單個 Python 腳本,所以有很多代碼支持這個只有一行的 hello.pyx 文件。

要使用 Python 的 “hello world” 腳本的 C 代碼版本,請打開一個 Python 提示符并導入你創(chuàng)建的新 hello 模塊:

>>> import hellohello world

將 C 代碼集成到 Python 中

測試計算能力的一個很好的通用測試是計算質數。質數是一個比 1 大的正數,且它只有被 1 或它自己除后才會產生正整數。雖然理論很簡單,但是隨著數的變大,計算需求也會增加。在純 Python 中,可以用 10 行以內的代碼完成質數的計算。

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")

這個腳本在成功的時候是不會提醒的,如果這個數不是質數,則返回一條信息:

$ ./prime.py 3$ ./prime.py 4Not prime.

將這些轉換為 Cython 需要一些工作,一部分是為了使代碼適合用作庫,另一部分是為了提高性能。

腳本和庫

許多用戶將 Python 當作一種腳本語言來學習:你告訴 Python 想讓它執(zhí)行的步驟,然后它來做。隨著你對 Python(以及一般的開源編程)的了解越多,你可以了解到許多強大的代碼都存在于其他應用程序可以利用的庫中。你的代碼越 不具有針對性,程序員(包括你)就越可能將其重用于其他的應用程序。將計算和工作流解耦可能需要更多的工作,但最終這通常是值得的。

在這個簡單的質數計算的例子中,將其轉換成 Cython,首先是一個設置腳本:

from setuptools import setupfrom Cython.Build import cythonize setup(    ext_modules = cythonize("prime.py"))

將你的腳本轉換成 C:

$ python setup.py build_ext --inplace

到目前為止,一切似乎都工作的很好,但是當你試圖導入并使用新模塊時,你會看到一個錯誤:

>>> 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

這個問題是 Python 腳本希望從一個終端運行,其中參數(在這個例子中是要測試是否為質數的整數)是一樣的。你需要修改你的腳本,使它可以作為一個庫來使用。

寫一個庫

庫不使用系統(tǒng)參數,而是接受其他代碼的參數。對于用戶輸入,與其使用 sys.argv,不如將你的代碼封裝成一個函數來接收一個叫 number(或者 num,或者任何你喜歡的變量名)的參數:

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")

這確實使你的腳本有些難以測試,因為當你在 Python 中運行代碼時,calculate 函數永遠不會被執(zhí)行。但是,Python 編程人員已經為這個問題設計了一個通用、還算直觀的解決方案。當 Python 解釋器執(zhí)行一個 Python 腳本時,有一個叫 __name__ 的特殊變量,這個變量被設置為 __main__,但是當它被作為模塊導入的時候,__name__ 被設置為模塊的名字。利用這點,你可以寫一個既是 Python 模塊又是有效 Python 腳本的庫:

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) )

現在你可以用一個命令來運行代碼了:

$ python ./prime.py 4Not a prime

你可以將它轉換為 Cython 來用作一個模塊:

>>> import prime>>> prime.calculate(4)Not prime

關于“C語言優(yōu)化Python代碼的方法是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C語言優(yōu)化Python代碼的方法是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI