久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Cython學(xué)習(xí)

 dbn9981 2016-09-17

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

  • step1: 把.pyx文件被Cython便以為.c文件
  • step2: 把.c文件編譯為可導(dǎo)入的使用模塊.so(Windows下為.pyd)文件
1
2
python setup.py build
python setup.py install

:可能出現(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í)行

1
SET VS90COMNTOOLS=%VS100COMNTOOLS%

如果裝的是vs2010,那么在cmd命令行中執(zhí)行 

1
SET VS90COMNTOOLS=%VS110COMNTOOLS%

執(zhí)行

1
2
3
>>> import hello
>>> hello.say_hello()
Hello World!

  

例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

復(fù)制代碼
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
復(fù)制代碼

setup.py

復(fù)制代碼
from distutils.core import setup
from Cython.Build import cythonize
setup(
  name = 'Hello world app',
  ext_modules = cythonize("compute.pyx"),
)
復(fù)制代碼

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

1
2
3
python setup.py build
python setup.py install
python test.py

結(jié)果

1
read: 0.332332 s

使用靜態(tài)變量替換后的代碼

compute2.pyx

復(fù)制代碼
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
復(fù)制代碼

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

1
2
3
python setup.py build
python setup.py install
python test.py

結(jié)果

1
read: 0.109200s

結(jié)論

該測(cè)試用例,,使用靜態(tài)類型速度是不使用靜態(tài)類型的3倍,。

 

例3.2.2 靜態(tài)類型函數(shù)

把compute2.pyx中的函數(shù)變?yōu)?/p>

復(fù)制代碼
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
復(fù)制代碼

結(jié)果

1
read: 0.084859 s

結(jié)論:比例子3.2.1速度又快了

 

例3.3 調(diào)用C函數(shù)

復(fù)制代碼
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)
復(fù)制代碼
  • cpdef: 對(duì)于Python可使用的函數(shù)使用(為了使得在以后的Python程序中調(diào)用Sin,Cos函數(shù),,用cpdef,,而不用cdef)
  • cdef: 對(duì)于C可使用的函數(shù)使用

請(qǐng)注意,上面的代碼聲明了 math.h 里的函數(shù),,提供給 Cython 使用,。C編譯器在編譯時(shí)將會(huì)看到 math.h 的聲明,但 Cython 不會(huì)去分析 math.h 和單獨(dú)的定義,。

 

4. 延伸

Cython 0.22 documentation

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多