使用Cython而不是CPython + NumPy没有速度提升

时间:2013-05-28 01:51:15

标签: python numpy scipy linear-algebra cython

对于单一分配,我在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

2 个答案:

答案 0 :(得分:6)

因为你没有解决瓶颈问题。

听起来我现在所做的就是让方法调用NumPy更快一些。只有当您对NumPy进行批次调用时,这才会有所帮助,但您说这不是瓶颈对您而言。

Cython使您能够加速Python代码。它无助于您加速NumPy代码。

答案 1 :(得分:4)

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

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

看看here,以便比较加速python的不同方法。