Cython 讓Python變得更快
1 Cython 概述
根據百度百科和Cython官網(http://docs.cython.org)的文檔,Cython可以看作是一種編程語言,是Python語言的一個超集,目標是構建一個高級、面向對象、函數式和動態編程語言。Cython主要特性是支持可選的靜態類型聲明,這樣可以將Python源碼解析為C或C++代碼,并編譯為Python擴展模塊。這種特征可以非常方便的將Python與外部C庫的進行集成和交互,同時保留Python語言的簡單性。總之一句話,Cython可以綜合Python的易用性和C語言的高效率。
注意:這里需要注意Cython和CPython的區別,前者是一種編程語言,而CPython是C語言編寫的Python解析器。
2 Cython 安裝
Cython的安裝前置條件是需要一個C編譯器,不同的操作系統需要的C編譯器一般不同。下面給出不同操作系統的C編譯器安裝環境:
Linux操作系統:可以非常方便的安裝C編譯器 gcc,一般在開發環境中都自帶此包,如果沒有,可以通過在線安裝完成。比如在Ubuntu操作系統上,可以執行sudo apt get install build sential命令獲取gcc。
Mac OS X操作系統 :建議通過安裝XCode工具來完成C編譯器gcc的安裝,或者從網站上單獨下載完成安裝。
Windows操作系統:需要安裝Microsoft Visual C/C++(MSVC)或開源的MinGW(gcc的Windows發行版)。
關于Cython需要的C編譯器環境的安裝,這里不再贅述。下面以Ubuntu操作系統為例來說明如何安裝Cython庫。這里已經完成了Python3的基本環境搭建,可以執行如下命令:
#安裝pip apt install python3-pip #升級pip pip3.6 install pip --upgrade #安裝Cython pip3.6 install Cython
如果pip環境之前已經構建好,則可以直接執行 pip3.6 install Cython 即可,或者如果Python環境搭建不同,也可以執行pip3 install Cython或者pip3.7 install Cython。這里需要根據自己的實際情況來決定。
3 PyCharm安裝
這里我們介紹一下如何在Ubuntu操作系統上安裝Python開發工具PyCharm,這里可以下載社區版即可。Ubuntu操作系統上下載的是一個壓縮包,解壓后即可使用,可以通過瀏覽器進行下載,我這里的具體界面如下所示:
下載完成后,可以將此 pycharm-community-2021.2.3.tar.gz 壓縮文件移動到需要的目錄中,并切換到當前目錄后,執行如下命令進行解壓安裝:
tar -zxvf pycharm-community-2021.2.3.tar.gz
解壓后,進入目錄,然后再進入bin目錄,具體執行如下命令即可啟動程序:
cd pycharm-community-2021.2.3 cd bin ls ################################################# brokenPlugins.db idea.properties ltedit.sh pycharm.sh format.sh inspect.sh printenv.py pycharm.svg fsnotifier libdbm64.so pycharm64.vmoptions restart.py icons.db log.xml pycharm.png ################################################# .\pycharm.sh
啟動界面后,需要同意相關協議,并可以創建項目,這里需要配置Python解析器環境,這里需要根據實際情況進行設置。界面如下所示:
至此,我們的開發環境就基本構建完成了。這里可以創建一個Python項目備用。
4 Cython 編譯過程
這里我們可以參考官網 http://docs.cython.org/en/latest/src/quickstart/build.html 的文檔,一般來說,Cython編譯過程主要由下面的2步驟構成:
(1)首先將Python源碼( .py 或 .pyx 文件)通過Cython編譯器翻譯為 .c 文件, 此文件包含Python擴展模塊( extension module)
(2)將第一步生成的 .c 文件通過C編譯器(gcc)編譯為 .so 文件(Linux操作系統)或 .pyd 文件(Windows操作系統)。這些 .so 文件或 .pyd 文件可以直接被 Python通過模塊進行導入。
這個過程一般需要編寫一個setuptools 文件 setup.py 來完成。官網給出了一個 setup.py一般結構,具體如下所示:
from setuptools import setup from Cython.Build import cythonize setup( name='Hello world app', ext_modules=cythonize("hello.pyx"), zip_safe=False, )
5 Cython Hello示例
這里參考官網 http://docs.cython.org/en/latest/src/quickstart/build.html 的文檔,給出一個Cython入門的Hello示例,首先在PyCharm項目中添加一個hello.pyx文件,.pyx 文件是由 Cython 編程語言編寫而成的 Python 擴展模塊源代碼文件,一般來說,不能直接被Python 識別,即不可導入。內容如下所示:
def my_sum(n): s = 0 for i in range(n + 1): s += i print("sum(", n, ")=>", s)
就是簡單的定義了一個my_sum函數,傳遞一個參數n,在內部進行求和,并通過print打印。然后再添加一個安裝工具setuptools 文件 setup.py,內容如下所示:
from setuptools import setup from Cython.Build import cythonize setup( name='Cython Hello Demo', ext_modules=cythonize("hello.pyx"), zip_safe=False, )
首先需要從setuptools模塊中導入setup函數,同時從Cython.Build模塊中導入cythonize方法,然后在setup函數中,通過 ext_modules=cythonize("hello.pyx")指定需要編譯的擴展模塊文件名。
然后執行如下命令進行編譯:
python3.6 setup.py build_ext --inplace
執行成功后,會生成如下文件,結構如下所示:
為了對比性能,再添加一個hello03.py文件,內容如下所示:
def my_sum_02(n): s = 0 for i in range(n + 1): s += i print("my_sum_02(", n, ")=>", s)
與hello.pyx文件內容除了函數名不一致外,其他都是一樣的。下面給出main.py文件內容:
import timeit if __name__ == '__main__': t1 = timeit.Timer("my_sum(1000)", "from hello import my_sum") print(t1.timeit(10000)) t2 = timeit.Timer("my_sum_02(1000)", "from hello03 import my_sum_02") print(t2.timeit(10000))
其中的timeit可以方便的進行時間統計,來評估代碼的執行效率。第一個t1統計Cython編譯過的hello模塊中的方法my_sum執行時間,而第二個t2用來統計Python代碼hello03模塊的my_sum_02方法的執行時間。我這里的結果如下所示:
1.0714793549996102 +++++++++++++++++ 1.9462227089989028
由此可見,此示例中的Cython編譯過的代碼執行效率會高一些。
gcc Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。