Python 是一种广泛应用于数据科学的高效动态编程语言。由于其采用简洁明了的语法,并具有标准数据结构、全面的标准库、高水准的文档、庞大的库和工具生态系统以及大型开放社区,因此深受欢迎。不过,也许最重要的原因是,Python 等动态型态解释语言能够带来超高效率。
但是,对于 Python 来说,这既是最大的优势,也是最大的劣势。“它的灵活性和无类型的高级语法可能会导致数据和计算密集型程序的性能不佳,因为运行本地编译代码要比运行动态解释代码快很多倍。因此,注重效率的 Python 程序员通常会使用 C 语言重写最内层的循环,然后从 Python 调用已编译的 C 语言函数。许多项目都力求简化这种优化(例如 Cython),但它们通常需要学习新的语法。虽然 Cython 显著提高了性能,但可能需要对 Python 代码进行艰巨的手动修改工作。
Numba 被视作 Cython 的替代方案,并且要简单得多。它最大的吸引力在于无需学习新的语法,也无需替换 Python 解释器、运行单独的编译步骤或安装 C/C++ 编译器。只需将 @jit Numba 修饰器应用于 Python 函数即可。这样,在运行时即可进行编译(即“即时”或 JIT 编译)。Numba 能够动态编译代码,这意味着,您还可以享受 Python 带来的灵活性。此外,Python 程序中由 Numba 编译的数值算法,可以接近使用编译后的 C 语言或 FORTRAN 语言编写的程序的速度;并且与原生 Python 解释器执行的相同程序相比,运行速度最多快 100 倍。这是一项重要进步,推动了高效编程与高性能计算的完美结合。
Numba 执行图
Numba 专为面向数组的计算任务而设计,与应用广泛的 NumPy 库类似。在面向数组的计算任务中,数据并行性与 GPU 等加速器自然契合。Numba 理解 NumPy 数组类型,并将其用于生成高效的编译代码,以在 GPU 或多核 CPU 上执行。所需的编程工作非常简单,只需添加一个 @vectorize 函数修饰器,指示 Numba 在运行时生成编译的向量化函数版本。这样,它便可用于在 GPU 上并行处理数据数组了。
除了为 CPU 或 GPU 即时编译 NumPy 数组代码外,Numba 还公开了“CUDA Python”:这是适用于 NVIDIA GPU 的 NVIDIA® CUDA® 编程模型,采用 Python 语法编写。加速 Python 后,它可以从胶水语言扩展至可高效执行数字代码的完整编程环境。
Numba 与 Python 数据科学生态系统中其他工具的结合使用,改变了 GPU 计算的体验。Jupyter Notebook 提供基于浏览器的文档创建环境,允许结合使用 Markdown 文本、可执行代码以及绘图和图像的图形输出。Jupyter 在教学、记录科学分析和交互式原型设计领域深受欢迎。
Numba 已在 200 多种不同的平台配置下进行了测试。它基于 Intel 和 AMD x86、POWER8/9、ARM CPU 以及 NVIDIA 和 AMD GPU 上的 Windows、Apple Macintosh、Linux 操作系统运行,大多数系统均可使用预编译的二进制文件。