一、Cython是什麼?
它是一個用來快速生成Python擴充套件模組(extention module)的工具
它的語法是python語言語法和c語言語法的混血
他比swig更容易編寫python的擴充套件模組
也許你會說swig可以直接透過c的標頭檔案生成擴充套件模組,但是swig對回撥函式的支援不是很好,
另外,如果用swig,很多情況下,你要寫額外的程式碼將輸入的引數轉換成python物件以及將輸出轉成python物件,例如如果封裝的一個C函式的引數是輸入輸出的話,又如如果C函式的引數中有回撥函式的話
而在Cython,C裡的型別,如int,float,long,char*等都會在必要的時候自動轉成python物件,或者從python物件轉成C型別,在轉換失敗時會丟擲異常,這正是Cython最神奇的地方
另外,Cython對回撥函式的支援也很好。
總之,如果你有寫python擴充套件模組的需求,那麼Cython真的是一個很好的工具
二、安轉cython
cython 在linux下安裝:
1. 原始碼包安裝:
[blueelwang@pythontab ~]$ wget https://pypi.python.org/packages/b7/67/7e2a817f9e9c773ee3995c1e15204f5d01c8da71882016cac10342ef031b/Cython-0.25.2.tar.gz [blueelwang@pythontab ~]$ tar xzvf Cython-0.25.2.tar.gz [blueelwang@pythontab ~]$ cd Cython-0.25.2 [blueelwang@pythontab ~]$ python setup.py install
2. pip包安裝
[blueelwang@pythontab ~]$ sudo pip install Cython --install-option="--no-cython-compile"
3. Ubuntu下安裝
[blueelwang@pythontab ~]$ sudo apt-get install cython
安裝後 輸入 cython 即可驗證是否安裝成功
三、使用
1、編寫以 .pyx為副檔名的 cython程式,hello.pyx
def say_hello_to(name): print("Hello %s!" % name)
2、編寫python程式 setup.py
其目的是把 hello.pyx程式轉化成hello.c ,並編譯成so檔案
from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [Extension("hello", ["hello.pyx"])] setup( name = 'Hello world app', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules )
3. 執行python程式
[blueelwang@pythontab ~]$ python setup.py build_ext --inplace
執行的結果會生成兩個檔案:hello.c 和 hello.so( 用PyObject* 封裝好的檔案)
4. 用python呼叫 hello.so,呼叫檔案為test.py
import hello hello.say_hello_to("hi,cython!!")
cython的主要目的是: 簡化python呼叫c語言程式的繁瑣封裝過程,提高python程式碼執行速度(C語言的執行速度比python快)