簡體   English   中英

MATLAB 比 Python 快嗎?

[英]Is MATLAB faster than Python?

我想使用Biot-Savart 定律計算一些導體的磁場,並且我想使用 1000x1000x1000 矩陣。 在我使用 MATLAB 之前,但現在我想使用 Python。 Python 比 MATLAB 慢嗎? 如何讓 Python 更快?

編輯:也許最好的方法是用 C/C++ 計算大數組,然后將它們傳輸到 Python。 我想用VPython可視化。

EDIT2:在我的情況下哪個更好:C 還是 C++?

您可能會在此鏈接的底部找到一些有用的結果

http://wiki.scipy.org/PerformancePython

從介紹來看,

weave 與 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 的庫以及它的優化程度。

此鏈接包含許多語言的面向對象的數字包列表。

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

NumPy和 MATLAB 都使用底層BLAS實現來進行標准線性代數運算。 一段時間以來,兩者都使用ATLAS ,但現在 MATLAB 顯然還帶有其他實現,例如英特爾的數學內核庫(MKL)。 哪個更快取決於系統以及 BLAS 實現的編譯方式。 您還可以使用 MKL 編譯 NumPy, Enthought正在為他們的 Python 發行版提供 MKL 支持(請參閱他們的路線圖)。 這也是最近一篇關於此的有趣博客文章

另一方面,如果您需要更專業的操作或數據結構,那么 Python 和 MATLAB 都為您提供各種優化方法(如CythonPyCUDA等)。

編輯:我更正了這個答案以考慮不同的 BLAS 實現。 我希望它現在可以公平地反映當前的情況。

唯一有效的測試是對其進行基准測試。 這實際上取決於您的平台是什么,以及 Biot-Savart 定律映射到 Matlab 或 NumPy/SciPy 內置操作的程度。

至於讓 Python 更快,Google 正在開發 Unladen Swallow,這是一個用於 Python 的 JIT 編譯器。 可能還有其他類似的項目。

根據您的編輯 2,我強烈建議您使用 Fortran,因為您可以利用可用的線性代數子例程(Lapack 和 Blas),並且它比 C/C++ 更簡單用於矩陣計算。

如果您更喜歡使用 C/C++ 方法,我會使用 C,因為您可能需要在可能很簡單的接口上提供原始性能(矩陣計算往往具有簡單的接口和復雜的算法)。

但是,如果您決定使用 C++,則可以使用 TNT(Template Numerical Toolkit,Lapack 的 C++ 實現)。

祝你好運。

如果您只是使用 Python(使用 NumPy),它可能會更慢,這取決於您使用的部分、您是否安裝了優化的線性代數庫以及您對如何利用 NumPy 的了解程度。

為了讓它更快,你可以做一些事情。 有一個名為Cython的工具,它允許您將類型聲明添加到 Python 代碼並將其轉換為 C 中的 Python 擴展模塊。這會給您帶來多少好處取決於您對類型聲明的勤奮程度——如果您不這樣做的話根本不添加任何東西,您不會看到任何好處。 Cython 還支持 NumPy 類型,盡管這些類型比其他類型復雜一些。

如果你有一塊好顯卡,並且願意學習一點 GPU 計算方面的知識, PyCUDA也可以提供幫助。 (如果您沒有 nvidia 顯卡,我聽說還有一個 PyOpenCL 正在開發中)。 我不知道您的問題域,但如果它可以映射到 CUDA 問題,那么它應該能夠很好地處理您的 10^9 元素。

這是基於一些線性代數函數的 MATLAB 和NumPy / MKL之間的更新“比較”:

http://dpinte.wordpress.com/2010/03/16/numpymkl-vs-matlab-performance/

點積並沒有那么慢;-)

我找不到太多難以回答的數字來回答同樣的問題,所以我繼續自己進行了測試。 使用的結果、腳本和數據集都可以在我關於MATLAB 與 Python 速度進行振動分析的帖子中找到。

長話短說,MATLAB 中的 FFT 函數比 Python 更好,但您可以進行一些簡單的操作來獲得可比較的結果和速度。 我還發現,與 MATLAB 相比,在 Python 中導入數據更快(即使是使用 scipy.io 的 MAT 文件)。

我還想指出,Python (+NumPy) 可以通過 F2Py 模塊輕松地與 Fortran 交互,這基本上可以讓您在卸載到其中的代碼片段上獲得原生 Fortran 速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM