Numba is an open source JIT compiler that translates a subset of Python and NumPy code into fast machine code.
有点类似 taichi ?
# 本代码由 AI 生成 from numba import njit, prange import numpy as np # 示例:计算数组的平方和 @njit(parallel=True) def parallel_sum_squares(arr): n = 0.0 for i in prange(len(arr)): # 使用 prange 而不是 range n += arr[i] ** 2 return n # 测试 arr = np.random.rand(10_000_000) result = parallel_sum_squares(arr) print("结果:", result)
在 Numba 中,@jit
和 @njit
都是用于加速 Python 函数的装饰器,它们的功能有许多相似之处,但也存在一些关键区别。
特性 | @jit | @njit |
---|---|---|
解释模式支持 | 如果无法编译,会回退到 Python 解释模式运行 | 不支持回退,必须成功编译 |
简化 | 可以指定 nopython=True 显式启用高性能模式 | 等价于 @jit(nopython=True) |
性能 | 如果未指定 nopython=True ,可能性能较低 | 始终以高性能模式运行 |
调用灵活性 | 支持更多的参数配置 | 参数较少,专注高性能编译 |
调试方便性 | 可用于调试(在失败时会运行 Python 解释器) | 不适合调试(直接报错) |
@jit
:
nopython=True
来禁用回退模式。示例:
from numba import jit @jit def add(a, b): return a + b # 如果无法编译,会回退到解释模式
@njit
:
@jit(nopython=True)
,强制 Numba 使用 nopython 模式。示例:
from numba import njit @njit def add(a, b): return a + b # 必须编译成功,否则抛出错误
@jit
:@jit
的性能可能稍差,因为它支持回退到解释模式。nopython=True
,则性能和 @njit
相当。@njit
:nopython
模式,专注于性能。
@jit
:
nopython
, cache
, parallel
等。@jit(nopython=True, parallel=True) def compute(arr): return arr ** 2
@njit
:
@njit def compute(arr): return arr ** 2
@jit
:nopython=True
时,如果编译失败,可以回退到解释模式运行,便于调试。@njit
:开发和调试阶段:
@jit
,因为它支持回退模式,可以帮助快速找到不支持 Numba 的代码部分。追求性能的生产环境:
@njit
,因为它专注于高性能执行,且不允许回退,确保代码已优化。高性能并行计算:
parallel=True
使用,可以通过 prange
进行多线程加速。@njit
是 @jit
的简化形式,等价于 @jit(nopython=True)
。@njit
。@jit
。