【发布时间】:2013-05-22 20:57:19
【问题描述】:
对于 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 稀疏矩阵一个静态类型?
我的代码可以使用这个 google drive 链接下载: https://docs.google.com/file/d/0B-nchNKLtgjeWTE4OXZrVUpfcWs/edit?usp=sharing
【问题讨论】:
-
如果你要编写 你自己的
spsolve,Cython 会真的很有帮助,这在某种程度上比sparse.linalg.spsolve快。否则,99% 调用 numpy/scipy 的程序不会从 Cython 本身中受益。
标签: python numpy scipy linear-algebra cython