0

对于 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

4

2 回答 2

6

因为你没有解决瓶颈。

在我看来,您现在所做的就是让对 NumPy 的方法调用更快一点。只有当你对 NumPy 进行大量调用时,这才会有所帮助,但你说这不是瓶颈所在。

Cython 使您能够加速 Python 代码。它不会帮助您加快 NumPy 代码的速度。

于 2013-05-28T02:28:40.397 回答
4

因为大多数 Numpy 代码已经用 C 编写。C 代码当然不会从 Cython 中受益。

如果它运行得太慢,你应该怀疑你的算法。

在这里查看加速 python 的不同方式的比较。

于 2013-05-28T02:41:23.800 回答