1. Cythonæ¯ä»ä¹ï¼
å®æ¯ä¸ä¸ªç¨æ¥å¿«éçæPythonæ©å±æ¨¡å(extention module)çå·¥å
·
è¯æ³æ¯Pythonåcçæ··è¡
Cythonä½ä¸ºä¸ä¸ªPythonçç¼è¯å¨ï¼å¨ç§å¦è®¡ç®æ¹é¢å¾æµè¡ï¼ç¨äºæé«Pythonçé度ï¼éè¿OpenMPIåºè¿å¯ä»¥è¿è¡å§å¹¶è¡è®¡ç®ã
2. Cythonå®è£
ï¼Windowsï¼
æçç¯å¢æ¯win7 x64, python27, vs2010
å®è£
çåºç¡æ¯æä¸ä¸ªcç¼è¯å¨ï¼è¿é以vs2010为ä¾ï¼
ä»
http://cython.orgä¸è½½å®è£
å
ï¼è§£åå°ä¸ç®å½ï¼è¿å
¥è¯¥ç®å½ï¼å¨cmdå½ä»¤è¡ä¸æ§è¡
python setup.py install
注ï¼æ§è¡è¿ç¨å¯è½éå°é®é¢ï¼Windowsä¸pipå®è£
å
æ¥éï¼Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
解å³æ¹æ¡ï¼ä¸è½½Microsoft Visual C++ Compiler for Python 2.7ï¼ç¹å»ç´æ¥å®è£
å³å¯ã
3. ä¾å
ä¾3.1ï¼å
¥é¨
å建hello.pyxï¼å
容å¦ä¸
def say_hello():
print "Hello World!"
å建setup.pyï¼å
容å¦ä¸
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æ件ç¼è¯ä¸ºå¯å¯¼å
¥ç使ç¨æ¨¡å.so(Windowsä¸ä¸º.pyd)æ件
1
2
python setup.py build
python setup.py install
注ï¼å¯è½åºç°é®é¢ï¼Unable to find vcvarsall.bat
åå ï¼Python 2.7 ä¼æç´¢ Visual Studio 2008.å¦æä½ çµèä¸æ²¡æè¿ä¸ªçæ¬çè¯å°±ä¼æ¥éã
å¦æè£
çæ¯vs2010ï¼é£ä¹å¨cmdå½ä»¤è¡ä¸æ§è¡
1
SET VS90COMNTOOLS=%VS100COMNTOOLS%
å¦æè£
çæ¯vs2010ï¼é£ä¹å¨cmdå½ä»¤è¡ä¸æ§è¡ã
1
SET VS90COMNTOOLS=%VS110COMNTOOLS%
æ§è¡
1
2
3
>>> import hello
>>> hello.say_hello()
Hello World!
ãã
ä¾3.2 éè¿éæç±»åæé«é度
å¨Cythonä¸å¯ä»¥éè¿æ è®°éæç±»åæ¥æé«é度ï¼å¡æ¯æ 记为éæç±»åçé¨åé½ä¼å°å¨æè¯è¨ç±»åå为ç®åçc代ç ï¼ä»èæéã
ä½æ¯å¦æ滥ç¨éæç±»åï¼ä¼éä½å¯è¯»æ§ï¼çè³å ç±»å设置ä¸å½å¯¼è´é误类åæ£æ¥é æé度éä½ã
ä¾3.2.1 éæç±»ååé
Pythonåçæ代ç
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ï¼
æ§è¡
1
2
3
python setup.py build
python setup.py install
python test.py
ç»æ
1
read: 0.332332 s
使ç¨éæåéæ¿æ¢åç代ç
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)
æ§è¡
1
2
3
python setup.py build
python setup.py install
python test.py
ç»æ
1
read: 0.109200s
ç»è®º
该æµè¯ç¨ä¾ï¼ä½¿ç¨éæç±»åé度æ¯ä¸ä½¿ç¨éæç±»åç3åã
ä¾3.2.2 éæç±»åå½æ°
æcompute2.pyxä¸çå½æ°å为
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
ç»æ
1
read: 0.084859 s
ç»è®ºï¼æ¯ä¾å3.2.1é度åå¿«äº
ä¾3.3 è°ç¨Cå½æ°
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)
cpdef: 对äºPythonå¯ä½¿ç¨çå½æ°ä½¿ç¨ï¼ä¸ºäºä½¿å¾å¨ä»¥åçPythonç¨åºä¸è°ç¨Sinï¼Coså½æ°ï¼ç¨cpdefï¼èä¸ç¨cdefï¼
cdef: 对äºCå¯ä½¿ç¨çå½æ°ä½¿ç¨
请注æï¼ä¸é¢ç代ç 声æäº math.h éçå½æ°ï¼æä¾ç» Cython 使ç¨ãCç¼è¯å¨å¨ç¼è¯æ¶å°ä¼çå° math.h ç声æï¼ä½ Cython ä¸ä¼å»åæ math.h ååç¬çå®ä¹ã