【问题标题】:No speed gain with Cython over CPython+NumPyCython 在 CPython+NumPy 上没有速度提升
【发布时间】: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


【解决方案1】:

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

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

看看here 比较不同的python加速方式。

【讨论】:

  • 查看您提供的网址,您实际上发现 Cython 版本比 NumPy 版本运行得更快。尽管在 Cython 版本中使用了 NumPy 数组,但它们省略了切片,而是在 NumPy 数组上使用嵌套循环。我的代码是否可以从使用 Cython+NumPy 的切片切换到循环中受益,就像在 url 中一样?
  • 啊,太好了,这实际上可能会有所帮助,尽管收益并不大。
【解决方案2】:

因为你没有解决瓶颈。

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

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

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多