Hello World

需要将 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