使用 Numba 加速代码的错误方法

主要观点:当基于 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 指令数量差异所致,具体原因可参考相关书籍。
阅读 19
0 条评论