我想使用Biot–Savart law计算某些导体的磁场,我想使用1000x1000x1000矩阵。在我使用MATLAB之前,现在我想使用Python。 Python比MATLAB慢吗?如何让Python更快?
编辑: 也许最好的方法是用C / C ++计算大数组,然后将它们转移到Python。我想用VPython想象一下。
EDIT2:在我的情况下哪个更好:C还是C ++?
答案 0 :(得分:27)
您可以在此链接的底部找到一些有用的结果
http://wiki.scipy.org/PerformancePython
从介绍中,
编织与NumPy,Pyrex,Psyco,Fortran(77和90)和C ++的比较,用于求解拉普拉斯方程。
它还比较了MATLAB,并且似乎表现出与使用Python和NumPy时相似的速度。
当然这只是一个具体的例子,你的应用程序可能会允许更好或更差的性能。在两者上运行相同的测试并进行比较没有任何害处。
您还可以使用优化的库编译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的库以及它的优化程度。
此链接包含许多语言的面向对象数字包的列表。
答案 1 :(得分:19)
NumPy和MATLAB都使用标准线性代数运算的基础BLAS实现。有一段时间都使用ATLAS,但现在MATLAB显然还带有其他实现,如英特尔的Math Kernel Library(MKL)。哪一个更快取决于系统以及如何编译BLAS实现。您还可以使用MKL编译NumPy,Enthought正在为他们的Python发行版支持MKL(请参阅他们的roadmap)。这也是最近的interesting blog post。
另一方面,如果您需要更专业的操作或数据结构,那么Python和MATLAB都为您提供了各种优化方法(如Cython,PyCUDA,...)。
编辑:我更正了这个答案,以考虑不同的BLAS实现。我希望现在能够公平地反映现状。
答案 2 :(得分:7)
唯一有效的测试是对它进行基准测试。这实际上取决于您的平台是什么,以及Biot-Savart Law如何映射到Matlab或NumPy / SciPy内置操作。
至于加快Python的速度,谷歌正在开发Unladen Swallow,一个用于Python的JIT编译器。可能还有其他像这样的项目。
答案 3 :(得分:4)
根据您的编辑2,我强烈建议您使用Fortran,因为您可以利用可用的线性代数子程序(Lapack和Blas),并且它比C / C ++更简单,用于矩阵计算。
如果您更喜欢使用C / C ++方法,我会使用C,因为您可能需要在可能简单的界面上进行原始性能(矩阵计算往往具有简单的接口和复杂的算法)。
但是,如果您决定使用C ++,则可以使用TNT(模板数值工具包,Lapack的C ++实现)。
祝你好运。答案 4 :(得分:3)
如果您只是使用Python(使用NumPy),它可能会更慢,具体取决于您使用的是哪些部分,是否安装了优化的线性代数库,以及您如何知道如何利用NumPy。
为了加快速度,您可以做一些事情。有一个名为Cython的工具允许您向Python代码添加类型声明并将其转换为C语言中的Python扩展模块。这对您有多大好处取决于您对类型声明的勤勉程度 - 如果你根本不添加任何东西,你将看不到任何好处。 Cython也支持NumPy类型,尽管这些类型比其他类型更复杂。
如果你有一个好的显卡并愿意学习一点GPU计算,PyCUDA也可以提供帮助。 (如果你没有nvidia显卡,我听说还有一个PyOpenCL正在开发中)。我不知道你的问题域,但如果它可以映射到CUDA问题,那么它应该能够很好地处理你的10 ^ 9元素。
答案 5 :(得分:2)
这是基于一些线性代数函数的MATLAB和NumPy / MKL之间的更新“比较”:
http://dpinte.wordpress.com/2010/03/16/numpymkl-vs-matlab-performance/
点积不是那么慢; - )
答案 6 :(得分:0)
我还想指出Python(+ NumPy)可以通过F2Py模块轻松地与Fortran进行交互,这基本上可以让您在卸载到它的代码片段中使用Fortran本机速度。
答案 7 :(得分:0)
我找不到太多难以回答同样问题的数据,所以我继续自己做了测试。所使用的结果,脚本和数据集都可以在MATLAB vs Python speed for vibration analysis上的帖子中找到。
长话短说,MATLAB中的FFT函数比Python好,但你可以做一些简单的操作来获得可比较的结果和速度。我还发现,与MATLAB相比,Python中的导入数据 更快 (即使对于使用scipy.io的MAT文件)。