cython开始使用cython


备注

什么是Cython?

Cython编程语言通过类似C的静态类型,直接调用C函数的功能以及其他一些功能来丰富Python。这允许在仍然使用类似Python的语法的同时达到C级性能。

它是如何工作的?

使用cython源到源编译器编译Cython代码以创建C或C ++代码,而C或C ++代码又可以使用C编译器进行编译。这允许创建可以从Python或可执行文件导入的扩展。

与纯Python相比,Cython可以达到的主要性能增益源于绕过CPython API。例如,当添加两个整数时,Python对每个变量执行类型检查,找到满足找到的类型的add函数,并调用该函数。在Cython生成的C代码中,类型已经知道并且只进行了一次函数调用。因此,Cython尤其适用于类型清晰的数学问题。

如何使用它来加速我的代码?

在尝试使用Cython加速程序时,一个常见的用例是分析代码并将计算成本高昂的部分移动到已编译的Cython模块。这允许保留大部分代码的Python语法,并在最需要的地方应用加速。

你好,世界

需要将Cython pyx文件转换为C代码( cythonized )并在从Python中使用之前进行编译。一种常见的方法是创建一个扩展模块,然后在Python程序中导入。

在本例中,我们创建了三个文件:

  • hello.pyx 包含Cython代码。
  • test.py 是一个使用hello扩展的Python脚本。
  • setup.py 用于编译Cython代码。

hello.pyx

from libc.math cimport pow

cdef double square_and_add (double x):
    """Compute x^2 + x as double.

    This is a cdef function that can be called from within
    a Cython program, but not from Python.
    """
    return pow(x, 2.0) + x

cpdef print_result (double x):
    """This is a cpdef function that can be called from Python."""
    print("({} ^ 2) + {} = {}".format(x, x, square_and_add(x)))
 

test.py

# Import the extension module hello.
import hello

# Call the print_result method 
hello.print_result(23.0)
 

setup.py

from distutils.core import Extension, setup
from Cython.Build import cythonize

# define an extension that will be cythonized and compiled
ext = Extension(name="hello", sources=["hello.pyx"])
setup(ext_modules=cythonize(ext))
 

编译

这可以通过使用cython hello.pyx 将代码转换为C然后使用gcc 编译来完成。更简单的方法是让distutils处理这个:

$ ls
hello.pyx  setup.py  test.py
$ python setup.py build_ext --inplace
$ ls
build  hello.c  hello.cpython-34m.so  hello.pyx  setup.py  test.py
 

共享对象(.so)文件可以从Python导入和使用,所以现在我们可以运行test.py

$ python test.py
(23.0 ^ 2) + 23.0 = 552.0 
 

安装Cython

要使用Cython,需要两件事.Cython包本身,包含cython 源到源编译器和几个C和Python库的Cython接口(例如numpy)。要编译cython 编译器生成的C代码,需要一个C编译器。

第1步:安装Cython

系统不可知

Cython可以与几个系统无关的包管理系统一起安装。这些包括:

  1. PyPI通过pip或easy_install:

    $ pip install cython
    $ easy_install cython
     
  2. 使用conda的anaconda

    $ conda install cython
     
  3. 使用enpkg包管理器进行Enthought冠层:

    $ enpkg cython
     

此外,源代码可以从github下载并手动安装:

$ python setup.py install
 

Ubuntu,Debian

对于Ubuntu,可以使用cythoncython3 包。请注意,这些版本提供的版本比上面提到的安装选项更旧。

$ apt-get install cython cython3
 

视窗

对于Windows,可以使用pip安装的.whl文件由第三方提供。有关在Windows上安装.whl文件的详细信息,请访问此处


第2步:安装C编译器

要编译Cython生成的C文件,需要一个C和C ++编译器。建议使用gcc编译器,可以按如下方式安装。

Ubuntu,Debian

build-essential 包包含所需的一切。它可以使用以下命令从存储库安装:

$ sudo apt-get install build-essential
 

苹果电脑

XCode开发人员工具包含类似gcc的编译器。

视窗

MinGW (Windows的Minimalist GNU)包含Windows版本的gcc。也可以使用Visual Studio中的编译器。