构建 Cython 代码

不像 Python,Cython 代码必须编译。这分 2 阶段发生:

  • .pyx 文件通过 Cython 编译成 .c 文件,包含 Python 扩展模块代码。
  • .c 文件由 C 编译器编译成 .so 文件 (或 .pyd 在 Windows) 可以 import 直接进 Python 会话。distutils 或 setuptools 处理这部分。尽管 Cython 在某些情况下可以调用它们。

要完全理解 Cython + distutils/setuptools 的构建过程,可能想要阅读更多有关 分发 Python 模块 .

有几种方式能构建 Cython 代码:

  • 编写 distutils/setuptools setup.py 。这是正常和推荐方式。
  • 使用 Pyximport ,导入 Cython .pyx 文件,就好像它们是 .py 文件 (使用 distutils 在后台编译和构建)。此方法更容易比编写 setup.py ,但不是很灵活。因此需要编写 setup.py 例如,若需要某些编译选项。
  • 运行 cython 命令行实用程序手动产生 .c 文件从 .pyx 文件,然后手动编译 .c 文件适合从 Python 导入的共享对象库或 DLL (这些手动步骤主要用于调试和实验)。
  • 使用 [Jupyter] 笔记本或 [Sage] 笔记本,两者均允许内联 Cython 代码。这是开始编写 Cython 代码并运行它的最轻松方式。

目前,使用 distutils 或 setuptools 是构建和分发 Cython 文件的最常见方式。其它方法地更详细描述在 源文件和编译 章节对于参考手册。

使用 distutils 构建 Cython 模块

想象简单 hello world 脚本在文件 hello.pyx :

def say_hello_to(name):
    print("Hello %s!" % name)
					

以下是相应的 setup.py 脚本:

from distutils.core import setup
from Cython.Build import cythonize
setup(name='Hello world app',
      ext_modules=cythonize("hello.pyx"))
					

要构建,运行 python setup.py build_ext --inplace 。然后只需启动 Python 会话并执行 from hello import say_hello_to 并使用导入函数如您认为合适。

告诫,若使用 setuptools 而不是 distutils,默认动作当运行 python setup.py 安装 是创建压缩 egg 文件不会工作采用 cimport for pxd 文件当试着从依赖包使用它们时。为阻止这种情况,包括 zip_safe=False 在自变量到 setup() .

使用 Jupyter 笔记本

Cython 可以通过 Jupyter 笔记本从 Web 浏览器方便且交互使用。要安装 Jupyter 笔记本 (如:要安装到 virtualenv),使用 pip:

(venv)$ pip install jupyter
(venv)$ jupyter notebook
					

要启用 Cython 编译支持,安装 Cython 的描述在 安装指南 和加载 Cython 扩展从 Jupyter 笔记本内:

%load_ext Cython
					

然后,前缀单元采用 %%cython 标记来编译它:

%%cython
cdef int a = 0
for i in range(10):
    a += i
print(a)
					

可以展示 Cython 的代码分析通过传递 --annotate 选项:

%%cython --annotate
...
					
../../_images/jupyter.png

自变量的更多有关信息,对于 %%cython 魔法,见 编译采用 Jupyter 笔记本 .

使用 Sage 笔记本

../../_images/sage.png

对于 Sage 数学分发用户,Sage 笔记本允许透明地编辑和编译 Cython 代码,只需通过键入 %cython 在单元顶部并评估它。变量和函数的定义在导入进运行会话的 Cython 单元中。

[Jupyter] http://jupyter.org/
[Sage]
  1. Stein 等人,Sage 数学软件, http://www.sagemath.org/