numpy 比 eigen 这样的 c++ 线性代数库慢吗?
Is numpy slower than c++ linear algebra libraries like eigen?
我用它来实现神经网络。我更喜欢 NumPy,因为用 Python 准备数据更方便;但是,我担心 NumPy 不如 c++ 库快。
NumPy 是用 C 语言实现的。因此大多数时候您只需调用 C 语言,并针对某些功能优化 Fortran 函数或子例程。因此,使用 NumPy 执行许多任务时,您将获得不错的速度。您需要矢量化您的操作。不要在 NumPy 数组上编写 for
循环。当然,hand-optimized C 代码可以更快。另一方面,NumPy 包含许多已经优化的算法,这些算法可能比经验不足的 C 程序员编写的不太优化的 C 代码更快。
你可以逐渐从 Python 移动到 C Cython and/or use Numba
对于 jit-compilation 机器或 gpu 代码。
我不得不说,我认为这里的其他答案遗漏了一些东西。
首先,正如@Mike Muller 正确指出的那样,Python 的数值库有 C 或 Fortran(或两者)后端,因此纯 Python 的性能几乎无关紧要(因为与后端的性能相反,这可能很重要)。在这方面,无论您是通过 Python 还是 C++ 来操纵 MKL
之类的东西——几乎没有什么不同。
不过有两个区别:
Python 的优点 - 它是交互式的。这意味着,尤其是与 IPython Notebook 之类的东西结合使用时,您可以执行一个操作并绘制结果,执行另一个操作并绘制结果等。使用编译语言进行探索性分析很难获得这种效果像 C++ 或 Java.
在 Python 的不利方面 - 至少可以说,它及其科学生态系统不完美地处理多核。这是语言本身的一个基本问题(阅读有关GIL)。
我用它来实现神经网络。我更喜欢 NumPy,因为用 Python 准备数据更方便;但是,我担心 NumPy 不如 c++ 库快。
NumPy 是用 C 语言实现的。因此大多数时候您只需调用 C 语言,并针对某些功能优化 Fortran 函数或子例程。因此,使用 NumPy 执行许多任务时,您将获得不错的速度。您需要矢量化您的操作。不要在 NumPy 数组上编写 for
循环。当然,hand-optimized C 代码可以更快。另一方面,NumPy 包含许多已经优化的算法,这些算法可能比经验不足的 C 程序员编写的不太优化的 C 代码更快。
你可以逐渐从 Python 移动到 C Cython and/or use Numba 对于 jit-compilation 机器或 gpu 代码。
我不得不说,我认为这里的其他答案遗漏了一些东西。
首先,正如@Mike Muller 正确指出的那样,Python 的数值库有 C 或 Fortran(或两者)后端,因此纯 Python 的性能几乎无关紧要(因为与后端的性能相反,这可能很重要)。在这方面,无论您是通过 Python 还是 C++ 来操纵 MKL
之类的东西——几乎没有什么不同。
不过有两个区别:
Python 的优点 - 它是交互式的。这意味着,尤其是与 IPython Notebook 之类的东西结合使用时,您可以执行一个操作并绘制结果,执行另一个操作并绘制结果等。使用编译语言进行探索性分析很难获得这种效果像 C++ 或 Java.
在 Python 的不利方面 - 至少可以说,它及其科学生态系统不完美地处理多核。这是语言本身的一个基本问题(阅读有关GIL)。