主要观点:当基于 NumPy 的代码过慢时,可使用 Numba 加速,它使用 Python 语法且在运行时编译,易与现有 NumPy 代码配合,但 Numba 的 NumPy 支持可能是陷阱,会错过优化机会。文中通过将彩色图像转换为灰度图的例子展示了错误和正确使用 Numba 的方式。
关键信息:
- Numba 可通过添加
@numba.jit
装饰器将 Python 代码编译为机器代码,对 NumPy API 重新实现以兼容方式运行。 - 错误使用 Numba 时,虽能使代码稍快,但效果不明显,且内存使用量较大,因仍使用临时浮点数组。
- 正确使用 Numba 时,可使用
for
循环逐像素操作,代码速度提升 5 倍且更节省内存,因为 Numba 没有 NumPy 和普通 Python 的限制。 - 软件架构是性能约束因素,NumPy 的全数组范式对代码实现有硬限制,切换到快速
for
循环的编译语言可提供更多算法结构选项,减少内存使用并加速代码。
重要细节: - 示例中彩色图像形状为(525, 700, 3),数据类型为 uint8,内存使用 1102500 字节。
- 错误方式的代码
tg_numba
与原始tg_numpy
转换结果相同,但速度仅提升一点,内存使用约 6MB。 - 正确方式的
tg_numba_for_loop
代码使用for
循环逐像素操作,速度提升 5 倍至 536 微秒,内存使用仅 376733 字节。 - 对于速度提升原因,并非 CPU 指令数量差异所致,具体原因可参考相关书籍。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。