numba 必须用 @njit(而非 @jit)并配合 numpy 数组输入才能实现有效加速;否则默认回退至 python 解释器,性能无提升甚至更慢。

直接装完就能用,但不配 nopython=True 就等于白加速。 Numba 默认模式会回退到 Python 解释器,性能提升微乎其微,甚至更慢。
安装与基础装饰器怎么选:@njit 而不是 @jit
装完 pip install numba 后,别用 @jit —— 它默认开启 object 模式,允许调用任意 Python 对象,但几乎不提速。必须用 @njit(等价于 @jit(nopython=True)),强制走纯编译路径。
-
@njit会在首次调用时编译为机器码,后续调用直接执行,无解释开销 - 若函数里用了不支持的 Python 特性(如
dict.keys()、print()、类方法),@njit会直接报错,而不是静默降级 - 错误信息通常是
TypingError: Failed in nopython mode...,说明你踩到了类型限制边界
输入数据必须是 NumPy 数组,不能是 Python 列表
Numba 在 nopython 模式下无法处理 Python 的动态对象布局。传 list 进去会触发 LoweringError 或静默 fallback 到慢速路径。
- 必须提前转成
np.array,且推荐指定 dtype,比如np.float64或np.int32 - 避免混合类型:传入
[1, 2.0, 3]生成的数组是object类型,@njit直接拒编 - 小数组(
并行加速要显式启用:parallel=True + prange
普通 for i in range(...) 不会自动并行。@njit(parallel=True) 只是打开并行开关,真正起作用的是把 range 换成 numba.prange。
-
prange表示“并行可安全迭代”,Numba 才会把循环切片分发到多核 - 需确保循环体无数据依赖(比如
arr[i] = arr[i-1] + 1就不行) - 并行有启动成本,只在大数组(>10⁵ 元素)+ 计算量足够时才值得开
- Windows 上可能遇到
OSError: [WinError 87],关掉杀毒软件或改用 WSL 可缓解
第一次运行慢是正常的,但别让它反复编译
@njit 函数首次调用时编译,耗时可能远超执行本身。如果你每次运行都传不同 shape 或 dtype 的数组,Numba 会为每种组合单独编译一份——这就是“缓存爆炸”。
- 用
@njit(cache=True)把编译结果存到磁盘,下次启动直接加载 - 固定输入类型:比如明确写
def func(arr: np.ndarray[np.float64])(Python 3.9+ 类型提示)能减少签名变异 - 避免在循环里反复调用未预热的
@njit函数;宁可把多层逻辑塞进一个@njit函数里
最常被忽略的一点:Numba 不加速 I/O、内存分配、NumPy 的通用 ufunc(如 np.sin),它只加速你写的、带循环/条件/自定义计算的纯数值逻辑。别指望给 pd.read_csv 加个 @njit 就能提速。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











