• Cython学习


    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)文件
    python setup.py build
    python setup.py install
    

    :可能出现问题:Unable to find vcvarsall.bat

    原因:Python 2.7 会搜索 Visual Studio 2008.如果你电脑上没有这个版本的话就会报错。

    如果装的是vs2010,那么在cmd命令行中执行

    SET VS90COMNTOOLS=%VS100COMNTOOLS%
    

    如果装的是vs2010,那么在cmd命令行中执行 

    SET VS90COMNTOOLS=%VS110COMNTOOLS%

    执行

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

    执行

    python setup.py build
    python setup.py install
    python test.py
    

    结果

    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)

    执行

    python setup.py build
    python setup.py install
    python test.py
    

    结果

    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

    结果

    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 和单独的定义。

    4. 延伸

    Cython 0.22 documentation

  • 相关阅读:
    eyoucms遍历子栏目,有二级栏目的点击展开或者收缩
    eyoucms 遍历栏目下的子栏目
    帝国cms 内容页根据关键词来调用相关内容
    帝国cms 上传的图片前台不显示
    帝国cms 通过字段内容来获取数据
    eyoucms 去掉 index.php后缀
    通过jquery插件复制文字
    帝国cms 表单弹窗提交,判断后才能提交到后台
    动态库和静态库
    J-520-2018年第二届河北省大学生程序设计竞赛(快速幂取模)
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/4452881.html
Copyright © 2020-2023  润新知