对于单一分配,我在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云端硬盘链接下载: https://docs.google.com/file/d/0B-nchNKLtgjeWTE4OXZrVUpfcWs/edit?usp=sharing
答案 0 :(得分:6)
因为你没有解决瓶颈问题。
听起来我现在所做的就是让方法调用NumPy更快一些。只有当您对NumPy进行批次调用时,这才会有所帮助,但您说这不是瓶颈对您而言。
Cython使您能够加速Python代码。它无助于您加速NumPy代码。
答案 1 :(得分:4)