MATLAB比Python更快吗?

42

我想使用Biot-Savart 定律计算一些导体的磁场,需要使用一个1000x1000x1000的矩阵。以前我用MATLAB,但现在我想用Python。Python比MATLAB慢吗?如何使Python更快?

编辑: 也许最好的方法是使用C/C++计算大数组,然后将它们转移到Python中。我想使用VPython进行可视化。

编辑2:在我的情况下,哪种语言更好:C还是C++?


4
没有代码很难估计速度。如果您有一些能够工作的Python代码,可以再次发布它以获取加速建议。 - extraneon
1
Matlab 在优化矩阵计算方面通常表现得非常优秀。 - BlueRaja - Danny Pflughoeft
@Blue:单个计算应该非常快。但我们不知道Biot-Savart映射到Matlab计算的效果如何。如果它不适合向量化,它会变得相当慢。 - Mike DeSimone
7
当然,你必须意识到这需要创建至少一个包含10亿元素的矩阵。如果它们全部是双精度浮点数,那么大约需要8GB的内存。无论你做什么,这都需要一些时间。 - user85109
1
在我的物理系,我们主要使用C/C++或FORTRAN,但有些人使用Python作为C的“前端”,这是一种非常好的方式。我会选择Python+C的方法。 - Boldewyn
9
如果你以前没有使用过C/C++,请不要使用它们。这将会是一种沮丧的练习。 - Meh
8个回答

28

你可能会在这个链接底部找到一些有用的结果。

http://wiki.scipy.org/PerformancePython

从简介中可以看出,它比较了使用Weave、NumPy、Pyrex、Psyco、Fortran(77和90)以及C++求解Laplace方程的性能。

它还将MATLAB进行了比较,并且似乎显示使用Python和NumPy与使用MATLAB时速度相似。

当然,这只是一个具体的例子,你的应用程序可能会有更好或更差的性能。在两者上运行相同的测试并进行比较是没有坏处的。

你也可以使用优化库编译NumPy,例如ATLAS提供一些BLAS/LAPACK例程。这些应该与MATLAB的速度相当。

我不确定NumPy下载是否已经构建了它,但我认为如果你编译NumPy,ATLAS将调整库以适应你的系统。

http://www.scipy.org/Installing_SciPy/Windows

该链接详细介绍了在Windows平台下所需的内容。

编辑:

如果你想知道C或C++哪个性能更好,那么提出一个新问题可能是值得的。尽管从上面的链接中可以看出,C++的性能最佳。其他解决方案也相当接近,例如Pyrex、Python/Fortran(使用f2py)和内联C++。

我在C++中做过的唯一的矩阵代数是使用MTL并实现了扩展卡尔曼滤波器。不过,本质上这取决于您使用的库LAPACK / BLAS以及其优化程度。

这个链接列出了许多语言的面向对象数值计算包。

http://www.oonumerics.org/oon/


无法再访问第一个链接。 - Gabriel Ziegler

21
NumPy 和 MATLAB 都使用基础的 BLAS 实现进行标准线性代数运算。一段时间以来,两者都使用了 ATLAS,但是现在 MATLAB 显然也配备了其他实现,例如 Intel 的 Math Kernel Library(MKL)。哪个更快取决于系统和如何编译 BLAS 实现。您还可以使用 MKL 编译 NumPy,Enthought 正在为其 Python 发行版开发 MKL 支持(请参见其 roadmap)。这里还有一篇最近的 interesting blog post 关于此事。

另一方面,如果您需要更专业的操作或数据结构,则 Python 和 MATLAB 均提供各种优化方式(例如 Cython, PyCUDA,...)。

编辑:我更正了这个答案,考虑到不同的BLAS实现。希望现在它能够公平地反映当前情况。


1
你应该详细说明你所说的“相同的底层数值库”是什么意思。Matlab是闭源软件,比Python和NumPy都要早得多,因此我很难想象除了SSE指令集之外还有什么共同点。 - Mike DeSimone
2
点赞。没有人(我夸张了)会写矩阵操作例程,每个人都会调用它们。当然,首先必须有人编写它们,但如果您正在编写Matlab或SciPy,则会找到针对目标平台的BLAS的高速实现,并调用该实现。我会非常惊讶地发现其中一个比另一个快得多。 - High Performance Mark
@Mike:这是相当普遍的知识,但对于没有科学计算经验的人,我在我的回答中添加了一些更多的信息。 - nikow

7

唯一有效的测试是进行基准测试。这实际上取决于您的平台以及Biot-Savart定律如何映射到Matlab或NumPy/SciPy内置操作。

至于使Python更快,Google正在开发Unladen Swallow,这是一个针对Python的JIT编译器。可能还有其他类似的项目。


但你能做一个大概的估计吗? - kame
1
不完全是这样。如果一切都做得对,两者深层都将运行矢量化的C代码。我不知道Matlab有多优化(无法访问代码),或者NumPy/SciPy在使用SSE(或等效)指令方面有多快(没有查看)。我也不知道Unladen Swallow会使Python代码快多少。此外,Matlab更喜欢以“double”精度存储数据;您没有告诉我们您的Python代码是使用“float”还是“double”或其他内容。简而言之,这是一个典型的数据不足案例。因此,“唯一有效的测试是战斗”。 - Mike DeSimone
我在这个领域的经验已经超过六年,结束于七年前。那时候,我使用了几家供应商提供的库(其中之一是Intel MKL)。当时Matlab坚持使用double(他们最近才开始支持无符号8位),这意味着我们不得不用C或C++编写一些算法来加速它们。因此,我编写了一个库作为各种实现的一层,这样我们的开发人员只需要处理一个API。有些算法仍然太慢,必须用汇编重写。话虽如此,我不明白我的回答哪里有误导之处。 - Mike DeSimone

5
根据您的编辑2,我强烈建议您使用Fortran,因为您可以利用现有的线性代数子程序(Lapack和Blas),而且它比C/C++更简单,适合进行矩阵计算。
如果您更喜欢使用C/C++方法,我会选择C,因为您可能需要在预设简单接口上获得原始性能(矩阵计算往往具有简单的接口和复杂的算法)。
然而,如果您决定使用C ++,则可以使用TNT(模板数值工具包,Lapack的C ++实现)。
祝你好运。

3
如果你只使用Python(带有NumPy),速度可能会较慢,这取决于你使用的哪些部分,是否安装了优化的线性代数库以及你对NumPy的了解程度。为了提高速度,有几件事情可以做。有一个名为Cython的工具,它允许你向Python代码添加类型声明,并将其翻译成C中的Python扩展模块。这能让你获得多少好处,有点取决于你在类型声明方面的勤奋程度——如果你根本不添加任何类型声明,那么你不会看到任何好处。Cython还支持NumPy类型,尽管这些类型比其他类型更加复杂。如果你有一张好的图形卡并愿意学习一些GPU计算知识,PyCUDA也可以帮助你。(如果你没有nvidia图形卡,我听说也有一个名为PyOpenCL的工具正在开发中)。我不知道你的问题域是什么,但如果它可以映射到一个CUDA问题中,那么它应该能很好地处理你的10^9个元素。

2

MATLAB的版本相当老了,我想知道这会有多大的影响。 - Royi

2

我无法找到很多硬数据来回答这个问题,所以我自己进行了测试。结果、脚本和数据集都可以在我发布的MATLAB与Python振动分析速度比较文章中找到。

长话短说,MATLAB中的FFT函数比Python更好,但你可以进行一些简单的操作来获得可比较的结果和速度。我还发现,即使是对于使用scipy.io的MAT文件,在Python中导入数据也比MATLAB更快


0
我还想指出的是,Python (+NumPy) 可以很容易地通过 F2Py 模块与 Fortran 进行接口交互,这基本上可以让你在将代码卸载到其中的部分时获得原生的 Fortran 速度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接