Cython是一個快速生成python擴充子產品的工具。它允許在python中加入C語言的文法,并且編譯後運作的速度比原生的python要高。此外,使用Cython還可以保護你的Python代碼,使其閉源,難以被反編譯。
下面讓大家快速入門cython的使用:
一. Cython的安裝:
Cython的安裝非常簡單。直接在cmd控制台中執行pip install cython即可。當然我們推薦使用anaconda,它本身就幫我們裝好cython了。
二. Cython入門教程:
下面以一個簡單的例子讓大家快速掌握Cython的最實用而且是最常用的使用方法:
1. 準備好要打包的python源檔案(正常的python源檔案字尾是.py,但為了用cython編譯,我們需要把字尾改成.pyx)。
本例的源檔案為:test.pyx,内容如下:
import time
import numpy as np
start_time = time.time()
a = np.random.rand(100, 100) * 2 - 1 # 生成300*300的随即矩陣
b = np.random.rand(100, 100) * 2 - 1
for i in range(500000):
c = a + b # 矩陣相加
c = a * b # 矩陣元素相乘
end_time = time.time()
print(end_time - start_time) # 輸出時間
2. 準備一個執行cython編譯的腳本:setup.py,并把它放在test.pyx源檔案同目錄下。其内容如下:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
filename = 'test' # 源檔案名
full_filename = 'test.pyx' # 包含字尾的源檔案名
setup(
cmdclass = {'build_ext': build_ext},
ext_modules = [Extension(filename, [full_filename])] # 配置需要cython編譯的源檔案
)
3. 這是最後一步:在setup.py檔案所在的目錄下打開一個cmd控制台(PowerShell也是可以哒~),在控制台中執行以下指令,即可完成cython的編譯啦:
python setup.py build_ext --inplace
執行成功的圖例:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXycGVNpXV61keNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jM5ITOxcTN4AzMxUDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
編譯成功後,在同目錄下會生成以下編譯好的檔案(字尾是.pyd):
它可以被python直接import,下面在同目錄下的cmd或PowerShell控制台運作一下python試試:(為了避免被認為是import了之前的test.pyx檔案,我們把同目錄下原來的test.pyx檔案删掉),執行效果如下圖:
由此可見,.pyx編譯成.pyd之後,可以被python直接import,這裡在寫import語句的時候不需要管後面的"cp36-win_amd4"等多餘的内容。
細心的讀者不難發現,編譯出來的.pyd檔案是閉源的!是以,這也是一種讓python項目閉源的簡單實用的方法。
思考:我們發現剛剛的python代碼在原生python下執行跟經過了cython編譯後執行做對比,速度并沒有什麼差别。這是為什麼呢?不是說cython可以加速python代碼的執行效率嗎?
實際上:這是因為我們仍舊采用純python的文法來編寫。這樣盡管用cython來編譯,執行的時候還是按照python的那一套來運作的。是以效率并不會提升。但是,正因為是用cython編譯,我們可以在test.pyx上對源代碼進行修改,加入C語言的一些文法(再次強調,字尾是.pyx噢~),這樣就能快很多了。