用于执行稀疏线性代数的应用程序的Python与C++

Ran*_*Guy 4 c++ python linear-algebra

我正在编写一个应用程序,其中相当多的计算时间将用于执行稀疏矩阵和向量的基本线性代数运算(加,乘,乘以矢量,乘以标量等).到目前为止,我们已经使用C++和Boost矩阵库构建了一个原型.

我正在考虑切换到Python,以便于编写应用程序本身,因为看起来Boost库(简单的C++线性代数库)无论如何都不是特别快.这是一个研究/概念验证应用程序,因此只要编码时间也显着减少,一些运行时速度的降低是可以接受的(因为我假设C++几乎总是优于Python).

基本上,我正在寻找之前使用过这些库的人的一般建议.但具体来说:

1)我找到了scipy.sparse和pySparse.这些(或其他图书馆)是推荐的吗?

2)推荐C++以外的哪些库超出Boost?我已经看过各种带有C接口的库,但如果我能获得相对较好的性能,我还是希望做一些复杂度低的东西.

3)最终,就线性代数运算的运行时速度而言,Python在某种程度上可以与C++相媲美吗?我将需要进行许多线性代数运算,如果减速很重要,那么我可能甚至不应该尝试进行这种切换.

提前感谢您提供任何帮助以及您可以提供的相关经验.

Esc*_*alo 7

My advice is to fully test the algorithm in Python before translating it into any other language (otherwise you run the risk of optimizing prematurely a bad algorithm). Once you have clearly defined the best interface for your problems, you can factor it out to external code.

Let me explain.

Suppose your final algorithm consists of taking a bunch of numbers in (row, column, value) format and, say, computing the SVD of the corresponding sparse matrix. Then you can leave the entire interface to Python:

class Problem(object):
   def __init__(self, values):
       self.values = values

   def solve(self):
       return external_svd(self.values)
Run Code Online (Sandbox Code Playgroud)

where external_svd is the Python wrapper to a Fortran/C/C++ subroutine which efficiently computes the svd given a matrix in the format (row, column, value), or whatever floats your boat.

再次,首先尝试使用numpyscipy,以及任何其他标准的Python工具.只有这样,在您分析了代码之后,才能编写实际的包装器external_svd.

如果你走这条路线,你将有一个模块,这是用户友好(用户与Python交互,而不是与Fotran/C/C++),最重要的是,你将能够使用不同的后端:external_svd_lapack,external_svd_paradiso,external_svd_gsl,等(您选择的每个后端一个).

对于稀疏线性代数库,请检查英特尔数学核心库,PARADISO稀疏求解器,称为"MA27" 的Harwell子程序库(HSL).我已成功使用它们来解决非常稀疏,非常大的问题(查看非线性优化求解器IPOPT的页面,看看我的意思)


ThR*_*R37 5

正如 llasram 所说,python 中的许多库都是用 C/C++ 编写的,因此 python应该以可接受的速度运行。

在 C++ 上,您还可以测试 gsl(gnu 科学库),但我相信线性代数的例程将与 Boost 相同(这两个库都使用 BLAS)。对于稀疏线性代数,你应该看看SBLAS,但我从未使用过它。这是我看到的一个简短的一般“优点和缺点”:

  • C++:
    • 会迫使你保持一个结构良好的计划
    • 可以很容易地包装为高级语言(如 python),以确保快速测试(查看python c apiswig)。
  • Python :
    • 易于调试,但很容易导致程序结构不良
    • 可以非常轻松地导入数据进行测试
    • 有一些非常可靠的库,例如 scipy/numpy (顺便说一下,scipy 也使用 BLAS 进行线性代数)
    • 托管代码

我个人使用 gsl 进行矩阵操作,并将我的 C++ 库包装到 Python 库中,以便轻松地使用数据进行测试。在我看来,这是结合两种语言优点的一种方式。

  • 谁说Python很容易调试?=p (7认同)
  • 谁说 C++ 会迫使你编写结构良好的程序?=p (6认同)