Cython 创建的 C 模块可以加速 Python 代码的执行,这对使用效率不高的解释型语言编写的复杂应用是很重要的。
Cython 是 Python 编程语言的编译器,旨在优化性能并形成一个扩展的 Cython 编程语言。作为 Python 的扩展,Cython 也是 Python 语言的超集,它支持调用 C 函数和在变量和类属性上声明 C 类型。这使得包装外部 C 库、将 C 嵌入现有应用程序或者为 Python 编写像 Python 一样简单的 C 语言扩展语法变得容易。
Cython 一般用于创建 C 模块来加速 Python 代码的执行。这在使用解释型语言编写的效率不高的复杂应用中非常重要。
安装 Cython
你可以在 Linux、BSD、Windows 或 macOS 上安装 Cython 来使用 Python:
$ python -m pip install Cython
安装好后,就可以使用它了。
将 Python 转换成 C
使用 Cython 的一个好的方式是从一个简单的 “hello world” 开始。这虽然不是展示 Cython 优点的最好方式,但是它展示了使用 Cython 时发生的情况。
首先,创建一个简单的 Python 脚本,文件命名为 hello.pyx
(.pyx
扩展名并不神奇,从技术上它可以是任何东西,但它是 Cython 的默认扩展名):
print("hello world")
接下来,创建一个 Python 设置脚本。一个像 Python 的 makefile 一样的 setup.py
,Cython 可以使用它来处理你的 Python 代码:
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("hello.pyx")
)
最后,使用 Cython 将你的 Python 脚本转换为 C 代码:
$ python setup.py build_ext --inplace
你可以在你的工程目录中看到结果。Cython 的 cythonize
模块将 hello.pyx
转换成一个 hello.c
文件和一个 .so
库。这些 C 代码有 2648 行,所以它比一个一行的 hello.pyx
源码的文本要多很多。.so
库也比它的源码大 2000 倍(即 54000 字节和 20 字节相比)。然后,Python 需要运行单个 Python 脚本,所以有很多代码支持这个只有一行的 hello.pyx
文件。
要使用 Python 的 “hello world” 脚本的 C 代码版本,请打开一个 Python 提示符并导入你创建的新 hello
模块:
>>> import hello
hello world
将 C 代码集成到 Python 中
测试计算能力的一个很好的通用测试是计算质数。质数是一个比 1 大的正数,且它只有被 1 或它自己除后才会产生正整数。虽然理论很简单,但是随着数的变大,计算需求也会增加。在纯 Python 中,可以用 10 行以内的代码完成质数的计算。
import sys
number = int(sys.argv[1])
if not number >> import prime
Traceback (most recent call last):
File "", line 1, in
File "prime.py", line 2, in init prime
number = sys.argv[1]
IndexError: list index out of range
这个问题是 Python 脚本希望从一个终端运行,其中参数(在这个例子中是要测试是否为质数的整数)是一样的。你需要修改你的脚本,使它可以作为一个库来使用。
写一个库
库不使用系统参数,而是接受其他代码的参数。对于用户输入,与其使用 sys.argv
,不如将你的代码封装成一个函数来接收一个叫 number
(或者 num
,或者任何你喜欢的变量名)的参数:
def calculate(number):
if not number > import prime
>>> prime.calculate(4)
Not prime
C Python
用 Cython 将纯 Python 的代码转换为 C 代码是有用的。这篇文章描述了如何做,然而,Cython 还有功能可以帮助你在转换之前优化你的代码,分析你的代码来找到 Cython 什么时候与 C 进行交互,以及更多。如果你正在用 Python,但是你希望用 C 代码改进你的代码,或者进一步理解库是如何提供比脚本更好的扩展性的,或者你只是好奇 Python 和 C 是如何协作的,那么就开始使用 Cython 吧。
via: https://opensource.com/article/21/4/cython
作者:Alan Smithee 选题:lujun9972 译者:ShuyRoy 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出