2010-09-21 58 views
4

我被標寫在那裏的計算時間相當多的將專門用於執行基本線性代數運算(加法,乘法應用,乘以矢量乘法應用等等)稀疏矩陣和向量。到目前爲止,我們已經使用C++和Boost矩陣庫構建了一個原型。的Python與C++爲不稀疏線性代數

我考慮切換到Python,緩解編碼應用程序本身的,因爲它似乎Boost庫(易C++線性代數庫)是不是特別快呢。這是一個研究/概念驗證應用程序,所以只要編碼時間也大大減少,那麼運行時速度的一些降低是可以接受的(因爲我認爲C++幾乎總是會超越Python)。

基本上,我正在尋找的人誰之前已經使用這些庫一般建議。但具體是:

1)我發現scipy.sparse和和pySparse。這些(或其他圖書館)是推薦的嗎?

2)C++推薦使用Boost以外的庫嗎?我已經看到了各種帶有C接口的庫,但是如果我可以獲得相對較好的性能,我又想要做一些低複雜度的工作。

3)最終,將PYTHON在用於線性代數運算的運行時間速度方面是有點類似C++?我需要做很多很多的線性代數運算,如果減速很重要,那麼我可能甚至不應該嘗試做這個轉換。

預先感謝您提供的任何幫助和以前的經驗。

+0

考慮使用NAG庫,主要用於金融領域? – DumbCoder 2010-09-21 15:56:19

回答

2

我沒有直接適用的經驗,但scipy/numpy操作在C.幾乎所有的實現,只要你最需要做的在scipy/numpy函數來表示的,那麼你的代碼不應該不會比等效的C/C++慢很多。

4

正如llasram所說,Python中的許多庫都是用C/C++編寫的,因此python 應該以可接受的速度運行。在C++上,您也可以測試gsl(gnu科學庫),但我相信線性代數的例程將與Boost相同(兩個庫正在使用BLAS)。對於稀疏線性代數,你應該看看SBLAS,但我從來沒有使用它。 這裏有一個簡短的一般性「利弊」,我看到:

  • C++:
    • 將迫使你保持結構良好的程序
    • 可以很容易地包裹着高水平語言(如python)確保快速測試(請看the python c apiswig)。
  • 的Python:
    • 調試容易,但也容易導致嚴重,結構化程序
    • 可以很方便地導入的測試數據
    • 有一些非常可靠的庫,例如SciPy的/ numpy的(順便說一下,scipy也使用線性代數的BLAS)
    • managed code

我個人使用gsl進行矩陣操作,並將我的C++庫包裝到Python庫中以便輕鬆測試數據。在我看來,這是一種結合兩種語言的優點的方式。

+6

誰說C++會迫使你編寫一個結構良好的程序? = p – katrielalex 2010-09-21 16:33:20

+6

誰說Python易於調試? = p – Wok 2010-09-21 16:47:21

1

現在速度不再是python的問題,因爲ctypes和cython出現了。 cython最棒的地方在於你寫的python代碼,它不需要你知道一行c就可以編譯出一個庫,或者你甚至可以創建一個stanalone。 Ctypes雖然比較慢,但也相似。從我進行的測試來看,cython代碼和c代碼一樣快,而且由於cython代碼被轉換爲c代碼,所以這很有意義。 Ctypes比較慢。

因此,最終它的一個分析問題,看看什麼是慢的python,並將其移動到cython,或者你可以用cython包裝你現有的c庫python。這樣很容易實現c速度。

所以我建議不要浪費你創建這些c庫的努力,用cython包裝它們,用python做其餘的工作。或者你可以用cython做所有的事情,如果你希望cython是python吧有一些限制。甚至可以讓你混合使用c代碼。所以你可以在c和python/cython的一部分中完成它的一部分。取決於什麼讓你感覺更舒適。

Numpy ans SciPy也可以用於節省更多時間,併爲您的問題/需求提供隨時可用的解決方案。您當然應該檢查它們。 Numpy甚至還有一個編織工具,可以讓你在你的python代碼中內聯c代碼,就像你可以在你的c代碼中內聯彙編代碼一樣。但我認爲你更喜歡使用cython。請記住,因爲cython同時是c和python,它允許您直接使用c和python庫。

7

我的建議是在將Python翻譯成任何其他語言之前,先對Python中的算法進行全面測試(否則會冒過早優化錯誤算法的風險)。一旦你清楚地爲你的問題定義了最好的界面,你可以將它分解爲外部代碼。

讓我解釋一下。

假設您的最終算法包括以(行,列,值)格式取一堆數字,並且比方說計算相應稀疏矩陣的SVD。然後可以離開整個界面到Python:

class Problem(object): 
    def __init__(self, values): 
     self.values = values 

    def solve(self): 
     return external_svd(self.values) 

其中external_svd是Python包裝到一個Fortran/C/C++子程序這有效地計算給定的格式的矩陣的SVD(行,列,值),或任何漂浮你的船。

同樣,首先嚐試使用numpyscipy以及任何其他標準Python工具。只有這樣,在分析完代碼之後,您是否應該編寫實際的包裝external_svd

如果你走這條路,你會得到一個用戶友好的模塊(用戶與Python交互,而不是Fotran/C/C++),最重要的是,你將能夠使用不同的後端: external_svd_lapackexternal_svd_paradiso,external_svd_gsl等(每個後端選擇一個)。

至於稀疏線性代數庫,檢查Intel Math Kernel Library,PARADISO sparse solver,Harwell Subroutine Library (HSL)稱爲「MA27」。我已經成功地使用它們來解決非常稀疏,非常大的問題(請查看非線性優化求解器IPOPT的頁面以瞭解我的意思)

4

2)看起來您正在尋找Eigen。 3)我想如果你在做稀疏線性代數,而不是遲一點,你會希望獲得每一點加速,所以我只需要堅持使用C++。除非快速測試一個原型,否則我已經看不到使用Python的一個要點,而原型已經在C++中完成了。