对于单个作业,我在MATLAB中编写了一个二维方形域流求解器。为了学习Python,我将MATLAB代码转换为Python。我使用NumPy来做所有的矩阵向量乘法,我使用scipy.sparse. linalga .spsolve()来求解Ax=b,其中A是40x40并且是稀疏的。
最后我对解算器的速度不太满意。所以我使用Spyder中包含的分析器来追踪瓶颈。基本上,所有的线性代数运算都非常快,除了系统求解(使用前面提到的方法)。这并不奇怪,因为解一个系统总是比仅仅乘一些向量和矩阵更昂贵。
我转向Cython来加速我的解算器。我读了http://wiki.cython.org/tutorials/numpy,我发疯了,给每个变量一个静态类型(是的,我知道这不是最聪明或最有效的方式,但我急于看到结果,之后会做适当的工作)。我唯一没有给出静态类型的是稀疏矩阵a,因为它是CSR稀疏矩阵,我还不知道如何静态类型它。是的,我知道这是最关键的部分,因为分析显示系统解决了瓶颈。
在最终设法用Cython编译所有内容后,结果与没有Cython的结果完全相同…我知道Cython的性能提升不会很大,因为我没有解决瓶颈,但是我不明白为什么Cython版本的运行速度没有提高1%。
有人能帮我从Cython受益吗?如何使我的代码运行得更快?我应该如何给CSR稀疏矩阵从scipy一个静态类型?
我的代码可以使用这个google drive链接下载:https://docs.google.com/file/d/0B-nchNKLtgjeWTE4OXZrVUpfcWs/edit?usp=sharing
因为你没有解决瓶颈。
对我来说,你现在所做的一切都是为了让NumPy的方法调用快一点。只有当你对NumPy进行大量调用时,这才会有所帮助,但你说这不是瓶颈所在。
Cython使您能够加速Python代码。它不会帮助你加速NumPy代码。
因为大多数Numpy代码已经是用C编写的。C代码当然不会受益于Cython。
如果运行太慢,你应该怀疑你的算法。
查看这里的不同方式来加快python的比较