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