Cython

Cython 代码与 python 不同,必须先编译,编译一般需要经过两个阶段,将 pyx 文件编译为 .c 文件,再将 .c 文件编译为 .so 文件
Cython 是用 python 实现的一种语言,可以用来写 python 扩展,用它写出来的库都可以通过 import 来载入,性能上比 python 的快。cython 里可以载入 python 扩展 ( 比如 import math),也可以载入 c 的库的头文件 ( 比如 :cdef extern from “math.h”),另外也可以用它来写 python 代码。将关键部分重写成 C 扩展模块
利用Cython,可以获得C的速度和C的函数,以及Python的函数
cdef的作用,就是把外部函数导出为cython能调用的函数,def的作用就是定义python能调用的函数了

python3.5需VS15以上
LINK : fatal error LNK1158: cannot run 'rc.exe'
FIX LINK : fatal error LNK1158: cannot run ‘rc.exe’

Add this to your PATH environment variables:

C:\Program Files (x86)\Windows Kits\8.0\bin\x86

Copy these files:

rc.exe rcdll.dll

From

C:\Program Files (x86)\Windows Kits\8.0\bin\x86

To

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin

#setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy
# ext_modules = [Extension("convolve1",["convolve1.pyx"]),
#                ]

setup(
    name = "convolve1 pyx",
    cmdclass = {'build_ext': build_ext},
    ext_modules=[
    Extension("convolve1", ["convolve1.pyx"],
    include_dirs=[numpy.get_include()]),
    ],
)

#第二种方法
# from distutils.core import setup
# # from Cython.Build import cythonize
# # 
# # setup(ext_modules = cythonize("hello.py"))

命令端:python setup.py build_ext --inplace生产对应的文件,主要是,.pyd文件
pyx中用cdef定义的东西,除类以外对.py都是不可见的;
.py中是不能操作C类型的,如果想在.py中操作C类型就要在.pyx中从python object转成C类型或者用含有set/get方法的C类型包裹类;
虽然Cython能对Python的str和C的“char *”之间进行自动类型转换,但是对于“char a[n]”这种固定长度的字符串是无法自动转换的。需要使用Cython的libc.string.strcpy进行显式拷贝;
回调函数需要用函数包裹,再通过C的“void *”强制转换后才能传入C函数

测试速度代码

http://python.jobbole.com/87368/

posted @ 2018-02-03 23:40  blog_hfg  阅读(427)  评论(0)    收藏  举报