1. Cython是什么,? 它是一個(gè)用來(lái)快速生成Python擴(kuò)展模塊(extention module)的工具 語(yǔ)法是Python和c的混血 Cython作為一個(gè)Python的編譯器,在科學(xué)計(jì)算方面很流行,,用于提高Python的速度,通過(guò)OpenMPI庫(kù)還可以進(jìn)行吧并行計(jì)算,。
2. Cython安裝(Windows) 我的環(huán)境是win7 x64, python27, vs2010 安裝的基礎(chǔ)是有一個(gè)c編譯器(這里以vs2010為例) 從http://下載安裝包,,解壓到一目錄,進(jìn)入該目錄,,在cmd命令行中執(zhí)行 python setup.py install
注:執(zhí)行過(guò)程可能遇到問(wèn)題:Windows下pip安裝包報(bào)錯(cuò):Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat 解決方案:下載Microsoft Visual C++ Compiler for Python 2.7,,點(diǎn)擊直接安裝即可。
3. 例子 例3.1:入門 創(chuàng)建hello.pyx,,內(nèi)容如下 def say_hello(): print "Hello World!" 創(chuàng)建setup.py,,內(nèi)容如下 from distutils.core import setup from Cython.Build import cythonize setup(name = 'Hello world app', ext_modules = cythonize("hello.pyx")) 編譯Cython代碼
注:可能出現(xiàn)問(wèn)題:Unable to find vcvarsall.bat 原因:Python 2.7 會(huì)搜索 Visual Studio 2008.如果你電腦上沒(méi)有這個(gè)版本的話就會(huì)報(bào)錯(cuò)。 如果裝的是vs2010,,那么在cmd命令行中執(zhí)行
如果裝的是vs2010,那么在cmd命令行中執(zhí)行
執(zhí)行
例3.2 通過(guò)靜態(tài)類型提高速度 在Cython中可以通過(guò)標(biāo)記靜態(tài)類型來(lái)提高速度,,凡是標(biāo)記為靜態(tài)類型的部分都會(huì)將動(dòng)態(tài)語(yǔ)言類型變?yōu)楹?jiǎn)單的c代碼,,從而提速。 但是如果濫用靜態(tài)類型,,會(huì)降低可讀性,,甚至因類型設(shè)置不當(dāng)導(dǎo)致錯(cuò)誤類型檢查造成速度降低。 例3.2.1 靜態(tài)類型變量 Python原生態(tài)代碼 compute.pyx def f(x): return x ** 2 - x def integrate_f(a, b, N): s = 0 dx = (b - a) / N for i in range(N): x += f(a + i * dx) return s * dx setup.py from distutils.core import setup from Cython.Build import cythonize setup( name = 'Hello world app', ext_modules = cythonize("compute.pyx"), test.py import compute import time starttime = time.clock() compute.integrate_f(3.2, 6.9, 1000000) endtime = time.clock() print "read: %f s" %(endtime - starttime) 執(zhí)行
結(jié)果
使用靜態(tài)變量替換后的代碼 compute2.pyx def f(double x): return x ** 2 - x def integrate_f(double a, double b, int N): cdef int i cdef double s, dx s = 0 dx = (b - a) / N for i in range(N): s += f(a + i * dx) return s * d setup2.py from distutils.core import setup from Cython.Build import cythonize setup( name = 'Hello world app', ext_modules = cythonize("compute2.pyx"), ) test2.py import compute2 import time starttime = time.clock() compute2.integrate_f(3.2, 6.9, 1000000) endtime = time.clock() print "read: %f s" %(endtime - starttime) 執(zhí)行
結(jié)果
結(jié)論 該測(cè)試用例,,使用靜態(tài)類型速度是不使用靜態(tài)類型的3倍,。
例3.2.2 靜態(tài)類型函數(shù) 把compute2.pyx中的函數(shù)變?yōu)?/p> cdef double f(double x): return x ** 2 - x def integrate_f(double a, double b, int N): cdef int i cdef double s, dx s = 0 dx = (b - a) / N for i in range(N): s += f(a + i * dx) return s * dx 結(jié)果
結(jié)論:比例子3.2.1速度又快了
例3.3 調(diào)用C函數(shù) cdef extern from "math.h": double sin(double) double cos(double) cpdef double Sin(double x): return sin(x) cpdef double Cos(double x): return cos(x)
請(qǐng)注意,上面的代碼聲明了 math.h 里的函數(shù),,提供給 Cython 使用,。C編譯器在編譯時(shí)將會(huì)看到 math.h 的聲明,但 Cython 不會(huì)去分析 math.h 和單獨(dú)的定義,。
4. 延伸
|
|
來(lái)自: dbn9981 > 《python與程序設(shè)計(jì)》