|
|
Python 是一种高级、解释型的动态编程语言,以简洁易读的语法和丰富的生态著称,适合快速开发、数据分析、Web 后端等各类应用。它的代码通常由 CPython 解释器直接执行,运行时进行类型推导,因此开发效率高,但执行速度相对较慢。
Cython 则是一个将 Python 代码编译成 C 扩展模块的工具,同时也是 Python 语言的超集。它在 Python 语法的基础上,允许开发者添加可选的 静态类型声明(例如 cdef int x),并将整个模块翻译成高效的 C 代码,最终编译为机器码。这使得 Cython 程序可以大幅提升性能,通常能达到与原生 C 相近的速度。
先翻译为 C,再编译为 .so/.pyd 扩展模块,由 Python 导入调用,接近 C 语言的速度(尤其是数值计算和循环)
典型例子
纯 Python 实现
def sum_of_squares(n):
total = 0
for i in range(n):
total += i * i
return total
Cython 优化版
def sum_of_squares(int n):
cdef int i
cdef int total = 0
for i in range(n):
total += i * i
return total
添加了静态类型声明后,循环部分被编译为纯 C 代码,速度可提升几十倍。
cdef int i Cython 会将传入的 Python 整数自动转换为 C int,省去了 Python 动态类型检查的开销,同时函数内部对 n 的访问都是直接的 C 变量读取。
普通 Python 的变量都是 PyObject*,每次读写都需要引用计数、类型检查等;而 C 变量在编译后对应机器指令中的寄存器或栈位置,操作速度与 C 语言完全相同
cythonize -i core.pyx 是一个用于将 Cython 源文件直接编译为当前目录可用的 Python 扩展模块的命令
安装cython
pip install cython
Collecting cython
Using cached cython-3.2.4-cp310-cp310-win_amd64.whl.metadata (7.7 kB)
Using cached cython-3.2.4-cp310-cp310-win_amd64.whl (2.8 MB)
Installing collected packages: cython
Successfully installed cython-3.2.4
检查安装情况:
import cython
print(cython.__version__)
如果是环境变量的问题,用
python -m Cython.Build.Cythonize 直接通过 Python 执行模块,不依赖 PATH,总是有效
建议日常开发直接使用 python -m Cython.Build.Cythonize -i .\test_cythonize.pyx,既简洁又可靠
Compiling D:\Program Files\Python310\MZ量化\test_cythonize.pyx because it changed.
[1/1] Cythonizing D:\Program Files\Python310\MZ量化\test_cythonize.pyx
test_cythonize.c
正在创建库 D:\Program Files\Python310\MZ量化\tmpp0136o43\Release\Program Files\Python310\MZ量化\test_cythonize.cp310-win_amd64.lib 和对象 D:\Program Files\Python310\MZ量化\tmpp0136o43\Release\Program Files\Python310\MZ量化\test_cythonize.cp310-win_amd64.exp
正在生成代码
已完成代码的生成
应该会成功生成 .c 文件和编译好的扩展模块(.pyd / .so)
test_cythonize.pyx
│
▼ (cython 命令)
test_cythonize.c ← C 源码(中间产物)
│
▼ (C 编译器:gcc / cl / clang)
test_cythonize.cp39-win_amd64.pyd ← 二进制扩展模块(最终产物)
│
▼ (Python 导入)
import test_cythonize → 直接调用函数,享受 C 级速度
调用和测试:
from test_cythonize import calc
print(calc(1, 2))
print(calc(1, 8))
44
50 |
|