2013-05-28 26 views
0

對於uni任務,我在MATLAB中編寫了一個2D方形域流動求解器。學習Python我已經將MATLAB代碼轉換爲Python。我用NumPy做所有的矩陣向量乘法,我用scipy.sparse.linalg.spsolve()來求解Ax = b,其中A是40x40並且是稀疏的。Cython在CPython + NumPy上沒有速度增益

最後我對求解器的速度並不滿意。因此,我使用Spyder中包含的分析器來追蹤瓶頸。基本上證明,除了系統求解(使用上述方法)之外,所有線性代數運算都相當快。這並不令人意外,因爲解決一個系統總是比只乘以一些向量和矩陣更昂貴。

我轉向Cython加速我的求解器。我讀http://wiki.cython.org/tutorials/numpy,我通過給每個變量一個靜態類型(是的,我知道這不是最聰明或最有效的方式,但我急於看到結果並在之後做一個適當的工作)而變得不合時宜。唯一沒有給出靜態類型的是稀疏矩陣A,因爲它是一個CSR稀疏矩陣,我還不知道如何靜態類型。是的,我知道這是最關鍵的部分,因爲剖析顯示系統解決了瓶頸。

在最終設法用Cython編譯所有東西后,結果與沒有Cython的結果完全一樣......我明白Cython的性能增益不會太好,因爲我沒有解決瓶頸問題,但是我不明白爲什麼Cython版本的運行速度甚至只有1%。

有人能幫我從Cython中受益嗎?我怎樣才能讓我的代碼更快運行?我應該如何從scipy靜態類型提供一個CSR稀疏矩陣?

我的代碼可以使用這個谷歌驅動器鏈接下載: https://docs.google.com/file/d/0B-nchNKLtgjeWTE4OXZrVUpfcWs/edit?usp=sharing

+1

如果你寫自己的''spsolve'比'sparse.linalg.spsolve'更快,Cython會真的有所幫助。否則,99%的程序調用numpy/scipy將不會從Cython中受益。 –

回答

6

因爲你沒有解決的瓶頸。

聽起來我現在所做的一切都是讓方法調用NumPy更快。這隻有在你撥打NumPy電話的批次時纔有所幫助,但是你說這不是瓶頸對你的影響。

Cython使您能夠加速Python代碼。它不會幫助你加快NumPy代碼。

4

因爲大多數Numpy代碼已經用C編寫了.C代碼當然不會從Cython中受益。

如果運行速度太慢,您應該懷疑算法。

看看here用於加速python的不同方式的比較。

+0

查看你提供的url,你會發現Cython版本的運行速度比NumPy版本快。儘管在Cython版本中使用了NumPy數組,但它們省略了使用切片,而是在NumPy數組上使用嵌套循環。我的代碼可以從使用Cython + NumPy切換到循環的方式獲益嗎? – Aeronaelius

+0

它似乎是這樣... http://stackoverflow.com/questions/7799977/numpy-vs-cython-speed –

+0

啊精彩這可能實際上有所幫助,雖然收益並不大。 – Aeronaelius