对于 uni assignment,我在 MATLAB 中编写了一个 2D 方域流求解器。为了学习 Python,我将 MATLAB 代码转换为 Python。我使用 NumPy 进行所有矩阵向量乘法,并使用 scipy.sparse.linalg.spsolve() 来求解 Ax=b,其中 A 为 40x40 且稀疏。
最后,我对求解器的速度不太满意。所以我使用 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