Python专题, 语言

使用Cython写Python的C扩展

Cython 是一个用于将 Python 代码优化为 C 扩展的工具,它结合了 Python 的易用性和 C 的高性能。工作原理是将 .pyx 文件编译为 .c 文件,再编译为共享库(.so 或 .pyd),可直接被 Python 导入。

这是之前的几篇:

相较于 Fortran/C/C++ 和 Python 的混合编程,Cython 具有语法接近于 Python,代码短的优点,可以代替手写 C 扩展。而相较于 Numba 的代码加速,Cython 是直接编译为 C,比 Numba 的 JIT 编译更接近机器码,支持显式静态类型、可调用任意 C/C++ 库,属于更近通用的加速方案。

从快速实现某个功能的角度来说,建议选用的顺序是:Python 原生代码 > Numba 加速 > Cython 优化 > Python 和 Fortran/C/C++ 的混合编程。从左往右,开发效率​​从高到低,与此同时,对应的运行效率是从低到高。而如果倾向于追求高的运行效率,那么推荐使用 Fortran/C/C++ 或者和它们和 Python 的混合编程,可以参考这篇:科学计算中编程语言的选择

特别说明:在实际应用时,Cython 的开发效率可能不一定比 Fortran/C/C++ 高,这是因为 Cython 是类 Python 语法的 C 语言,混合型语法容易让人困惑,但如果写习惯了应该就还好。Cython 最大的优点是在已经用 Python 实现某些功能的前提下,可以对源码稍作修改变成 Cython 代码,然后编译作为一个 Python 的 C 扩展,而不需要重新开始写。

通过命令行安装 Cython :

pip install cython

下面是一个学习的例子。

Cython 代码 example.pyx 内容为:

def calculate(int n):
    cdef int i

    cdef long long result = 0
    # cdef int result = 0  # 这个类型在数值比较大的时候会溢出,结果不正确。
    # result = 0  # 这个不声明类型,使用 Python 的 int,Python 的整数是任意精度的,不会溢出,但性能会比 C 类型低。

    for i in range(n):
        result += i
        
    return result

说明:Cython 的真正威力在于添加静态类型声明,更多的书写方法可以自行找资料学习。

安装文件 setup.py 内容为:

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

setup(ext_modules=cythonize("example.pyx"))

运行命令:

python setup.py build_ext --inplace

说明:这里的编译命令和“Python和C++语言的混合编程”中的相同,但 setup.py 文件内容不同。

运行后会产生 example.c 文件和 example.cpython-39-x86_64-linux-gnu.so 文件。

Python 代码 a.py 内容为:

import example
import time

def py_calculate(n):
    result = 0
    for i in range(n):
        result += i
    return result

n = 10**8

start = time.time()
py_result = py_calculate(n)
print(py_result)
py_time = time.time() - start

start = time.time()
cy_result = example.calculate(n)
print(cy_result)
cy_time = time.time() - start

print(f"Python 版本: {py_time:.6f} 秒")
print(f"Cython 版本: {cy_time:.6f} 秒")

运行 Python 程序:

python a.py

运行结果:

4999999950000000
4999999950000000
Python 版本: 3.126766 秒
Cython 版本: 0.033468 秒
17 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code