用途:Numba 是面向 Python 的即时(JIT)编译器,由 Anaconda 开发,把一部分 Python 与 NumPy 代码翻译为快速机器码,主要用于加速数值计算中的循环与数组操作。当 NumPy 内置向量化不足以覆盖算法、存在复杂嵌套循环、需要自定义逐元素 ufunc、进行高性能物理模拟(蒙特卡洛、N 体、网格求解器)、在 NVIDIA GPU(CUDA)上执行或需要多核并行时适用。
主要能力:nopython 模式(@njit)是推荐方式,编译时不经过 Python C-API,速度最高,无法编译时会报错;JIT 在首次调用时编译并缓存机器码;面向 NumPy 数组,理解其内存布局;支持 @njit(parallel=True) 配合 prange 自动多线程;@vectorize 创建支持广播的 ufunc;numba.typed 提供 List、Dict 等容器;numba.cuda 可编写 CUDA 内核。
使用方式:安装命令为 pip install numba。常用导入为 import numpy as np 与 from numba import njit, prange, vectorize, guvectorize, cuda。基本模式是用 @njit 装饰函数,首次调用编译、后续调用复用;并行用 @njit(parallel=True) 与 prange;缓存用 @njit(cache=True);可用 inspect_types() 检查是否回退到对象模式。
限制与注意:nopython 模式不支持字符串、字典、自定义类等 Python 对象,也不能在 @njit 内使用 pandas、matplotlib、requests 等库;不要对微小函数使用 JIT,调用开销可能超过收益;全局变量在编译时被捕获,修改后不会影响已编译函数,应作为参数传入;并行下随机数需注意每线程独立流;避免在热循环内分配数组,应预分配或作为参数传入。官方文档见 https://numba.pydata.org/numba-doc/latest/index.html,用户指南见 https://numba.pydata.org/numba-doc/latest/user/index.html。