Python与C++对稀疏线性代数的应用

2024-04-20 13:42:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我考虑切换到Python,以便于对应用程序本身进行编码,因为看起来Boost库(易用C++线性代数库)并不特别快。这是一个概念的应用研究/证明,所以运行速度的一些降低是可以接受的(因为我假设C++几乎总是优于Python),只要编码时间也显著减少。在

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

1)我发现稀疏稀疏还有pySparse。是否推荐这些(或其他库)?在

< P 2)C++推荐的超越Boost的库是什么?我已经看到了各种具有C接口的库,但是我还是希望能够获得相对较好的性能,并且能够实现低复杂度的功能。在

3)在线性代数运算中,Python是否与C++相比有一定的运行速度?我需要做很多,很多线性代数运算,如果减速很明显的话,我甚至不应该尝试做这个转换。在

提前感谢您的任何帮助和以往的经验,您可以联系。在


Tags: 证明应用程序概念编码时间矩阵性能向量
3条回答

正如LasasRAM所言,Python中的许多LIBs是用C/C++编写的,所以Python EM>应以EngE>运行速度为可接受的速度。在

< C++ >也可以测试GSL(GNU科学图书馆),但我相信线性代数的例程将与Boost(两个库使用BLAS)相同。对于稀疏线性代数,你应该看看SBLAS,但我从来没有用过它。 下面是我看到的一个简短的“利弊”:

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

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

我的建议是在将该算法翻译成任何其他语言之前,先用Python对其进行全面测试(否则,可能会过早地优化一个糟糕的算法)。一旦您为您的问题清楚地定义了最佳接口,您就可以将其分解为外部代码。在

让我解释一下。在

假设您的最终算法包括以(行、列、值)格式获取一组数字,并计算相应稀疏矩阵的SVD。然后您可以将整个接口留给Python:

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

   def solve(self):
       return external_svd(self.values)
< ^ > {{CD1>}是Porthon包装器到FORTRAN/C/C++子程序,它有效地计算给定格式的矩阵(行、列、值)或任何浮于您船的SVD。在

同样,首先尝试使用numpy和{},以及任何其他标准的Python工具。只有这样,在分析了代码之后,才应该编写实际的包装器external_svd。在

如果你走这条路线,你将拥有一个用户友好的模块(用户与Python交互,而不是用Fotran /C/C++),最重要的是,你将能够使用不同的后端:^ {CD5>},^ {< CD6>},^ {CD7>}等等(你选择的每一个后端都有一个)。在

对于稀疏线性代数库,请检查Intel Math Kernel LibraryPARADISO sparse solver、名为“MA27”的Harwell Subroutine Library (HSL)。我已经成功地使用它们来解决非常稀疏、非常大的问题(查看非线性优化求解器IPOPT页面,了解我的意思)

2)看起来你在找Eigen。在

3)我猜想,如果你在做稀疏线性代数,比你更快,你会想要每一点的加速,你可以得到,所以我只坚持用C++。我不认为使用Python来解决这个问题,除非快速测试一个原型,而这在C++中已经完成了。在

相关问题 更多 >