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