资讯详情

HoRain云--Python高性能计算:Cython、Numba与Rust混合编程

📅 2026/10/15 4:06:39 | 华诺云谱 👁 阅读
HoRain云--Python高性能计算:Cython、Numba与Rust混合编程
Python慢是公认的但通过C扩展、JIT、Rust绑定可以达到接近C的性能。本文讲解Cython、Numba、PyO3三种加速方案并对比实战。一、性能瓶颈分析python复制下载import timeit # 纯Python def fib_py(n): if n 2: return n return fib_py(n-1) fib_py(n-2) # 测试 print(timeit.timeit(lambda: fib_py(30), number1))先用cProfile定位热点再选择加速方案。二、CythonCython将Python代码编译为C扩展。bash复制下载pip install cython2.1 基础用法fib.pyxcython复制下载def fib(int n): cdef int i cdef long long a 0, b 1 for i in range(n): a, b b, a b return asetup.pypython复制下载from setuptools import setup from Cython.Build import cythonize setup( ext_modulescythonize(fib.pyx), )编译bash复制下载python setup.py build_ext --inplace使用python复制下载from fib import fib print(fib(100))2.2 类型声明cython复制下载# 声明变量类型 cdef int x 10 cdef double y 3.14 cdef list lst [1, 2, 3] # 函数类型 cdef int add(int a, int b): return a b # 结构体 cdef struct Point: double x double y # 内存视图 def sum_array(double[:] arr): cdef int i cdef double total 0 for i in range(arr.shape[0]): total arr[i] return total2.3 性能对比python复制下载# 纯Python约2秒 # Cython约0.01秒 # 提升200倍三、Numba JITNumba用LLVM在运行时编译只需一个装饰器。bash复制下载pip install numbapython复制下载from numba import jit, njit, prange import numpy as np njit def sum_squares(arr): total 0.0 for i in range(len(arr)): total arr[i] ** 2 return total arr np.random.rand(1000000) print(sum_squares(arr)) # 首次慢后续快3.1 并行加速python复制下载njit(parallelTrue) def parallel_sum(arr): total 0.0 for i in prange(len(arr)): total arr[i] ** 2 return total3.2 向量化python复制下载from numba import vectorize vectorize([float64(float64, float64)], targetcuda) def add_cuda(a, b): return a b3.3 适用场景数值计算循环密集NumPy数组操作不适用字符串处理、复杂对象、I/O。四、PyO3Rust绑定Rust性能接近C内存安全适合写扩展。bash复制下载pip install maturin maturin init --bindings pyo3src/lib.rsrust复制下载use pyo3::prelude::*; #[pyfunction] fn fib(n: u64) - u64 { if n 2 { return n; } let mut a 0u64; let mut b 1u64; for _ in 0..n { let temp a b; a b; b temp; } a } #[pyfunction] fn sum_squares(arr: Vecf64) - f64 { arr.iter().map(|x| x * x).sum() } #[pymodule] fn mylib(_py: Python, m: PyModule) - PyResult() { m.add_function(wrap_pyfunction!(fib, m)?)?; m.add_function(wrap_pyfunction!(sum_squares, m)?)?; Ok(()) }pyproject.tomltoml复制下载[build-system] requires [maturin0.14] build-backend maturin [project] name mylib requires-python 3.8编译bash复制下载maturin develop --release使用python复制下载import mylib print(mylib.fib(100))五、ctypes与cffi5.1 ctypes调用C库python复制下载import ctypes lib ctypes.CDLL(./libmath.so) lib.add.argtypes [ctypes.c_int, ctypes.c_int] lib.add.restype ctypes.c_int print(lib.add(1, 2))5.2 cffipython复制下载from cffi import FFI ffi FFI() ffi.cdef(int add(int a, int b);) lib ffi.dlopen(./libmath.so) print(lib.add(1, 2))六、四种方案对比方案性能学习曲线适用Cython高中通用加速Numba高低数值计算PyO3极高高系统编程ctypes中低调用现有C库七、实战加速图像处理python复制下载# 纯Python约10秒 def apply_filter_py(img, kernel): h, w img.shape result np.zeros_like(img) for i in range(1, h-1): for j in range(1, w-1): total 0.0 for ki in range(3): for kj in range(3): total img[i-1ki, j-1kj] * kernel[ki][kj] result[i, j] total return result # Numba约0.1秒 njit(parallelTrue) def apply_filter_numba(img, kernel): h, w img.shape result np.zeros_like(img) for i in prange(1, h-1): for j in range(1, w-1): total 0.0 for ki in range(3): for kj in range(3): total img[i-1ki, j-1kj] * kernel[ki][kj] result[i, j] total return result八、选择建议数值计算Numba通用加速Cython系统级、安全Rust PyO3已有C库ctypes/cffi简单场景先优化算法和数据结构九、总结Python性能优化优先级算法 数据结构 向量化 JIT/C扩展。Numba最简单Cython最通用Rust最强大。根据场景选择避免过早优化。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑