@njit是@jit(nopython=True)的简明别名,强制启用高性能nopython模式;禁用Python对象操作,仅支持基础NumPy函数和整数索引;prange配合parallel=True可并行加速,但需内存连续且无数据依赖。

直接加 @njit 装饰器,90% 的数值循环函数就能提速 10–100 倍;但前提是别用 Python 列表、字典、print、异常捕获这些 nopython 模式不认的东西。
为什么 @njit 比 @jit(nopython=True) 更推荐
@njit 是 @jit(nopython=True) 的别名,语义更明确、写法更短,且强制启用 nopython 模式——这是获得高性能的唯一可靠路径。一旦用了 @jit 不带参数,Numba 可能悄悄退化到 object 模式,性能提升微乎其微,还容易掩盖类型问题。
- 首次调用时会触发编译,有明显延迟(几百毫秒),但后续调用直接执行机器码
- 函数签名(参数类型)一旦确定,就不能再传不同 dtype 的 NumPy 数组,否则会重新编译甚至报错
- 不支持字符串操作、I/O、类实例方法、闭包变量(除非是常量)
@njit 下哪些 NumPy 操作能用、哪些会炸
Numba 对 NumPy 的支持集中在基础数组操作上,不是所有 np.xxx 都能进 nopython 模式。常见可用项包括:np.arange、np.zeros、np.sum(仅限一维)、np.sqrt、np.sin 等数学函数;而 np.append、np.concatenate、np.where(带复杂条件时)、np.random(需换用 numba.cuda.random 或 np.random.default_rng 配合 @njit 外部生成)基本不可用。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 数组索引必须用整数,不支持布尔索引或花式索引(如
arr[arr > 0]) - 避免在循环里动态改变数组长度——nopython 模式下没有“可变长数组”概念
- 多维数组优先用
arr[i, j]而非arr[i][j],后者可能触发对象模式回退
并行加速:用 prange 替代 range 的实际效果
当你把 for i in range(N): 改成 for i in prange(N):,并加上 @njit(parallel=True),Numba 会自动把循环分发到多个 CPU 核心。但这不是无代价的:数组必须是连续内存(arr.flags.c_contiguous 为 True),且不能有跨迭代的数据依赖(比如 total += arr[i] * arr[i-1] 就不行)。
立即学习“Python免费学习笔记(深入)”;
- 并行版首次调用编译时间更长,因为要生成线程调度逻辑
- 小数组(比如
- 记得用
numba.config.NUMBA_NUM_THREADS控制线程数,避免和 OpenMP 或其他库冲突
最容易被忽略的一点:Numba 加速只对「计算密集型」函数有效。如果函数里混着大量 os.path.join、json.loads、数据库查询或网络请求,加 @njit 不仅没用,还会因类型推断失败直接报错。真正的加速点永远在那个反复执行、纯数学运算的内层循环里。

















