Python与C ++的比较,用于稀疏线性代数的应用程序

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

我正在考虑切换到Python,以便于编写应用程序本身,因为Boost库(简易C ++线性代数库)似乎并不是特别快。 这是一个研究/概念验证应用程序,所以只要编码时间也大大减少,那么运行时速度的一些降低是可以接受的(因为我认为C ++几乎总是会超越Python)。

基本上,我从以前使用过这些库的人那里寻找一般建议。 但具体而言:

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

2)C ++推荐使用Boost以外的库吗? 我已经看到了各种带有C接口的库,但是如果我可以获得相对较好的性能,我又想要做一些低复杂度的工作。

3)最终,就线性代数运算的运行时速而言,Python是否可以与C ++相比? 我需要做很多很多的线性代数运算,如果减速很重要,那么我可能甚至不应该尝试做这个转换。

提前感谢您提供的任何帮助和以前的经验。


我的建议是在将Python翻译成任何其他语言之前,先用Python对算法进行全面测试(否则会冒过早优化错误算法的风险)。 一旦你清楚地为你的问题定义了最好的界面,你可以将它分解为外部代码。

让我解释。

假设你的最终算法包括以(行,列,值)格式取一堆数字,并且比方说计算相应稀疏矩阵的SVD。 然后你可以把整个界面留给Python:

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

   def solve(self):
       return external_svd(self.values)

其中external_svd是一个Fortran / C / C ++子例程的Python包装,它可以有效计算给定格式(行,列,值)中的矩阵的svd,或浮动你的船的任何东西。

再次,首先尝试使用numpyscipy以及任何其他标准Python工具。 只有在分析完代码之后,才能编写实际的wrapper external_svd

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

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


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

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

  • C ++:
  • 会迫使你保持一个结构良好的程序
  • 对于高级语言(如python)可以很容易地进行包装,以确保快速测试(查看python c api或swig)。
  • Python:
  • 易于调试但很容易导致结构严重的程序
  • 可以非常轻松地导入数据进行测试
  • 有一些非常可靠的库,比如scipy / numpy(顺便说一下,scipy也使用BLAS来处理线性代数)
  • 托管代码
  • 我personnaly使用gsl进行矩阵操作,并将我的C ++库封装到Python库中以便轻松测试数据。 在我看来,这是一种结合两种语言的优点的方式。


    2)看起来你正在寻找Eigen。

    3)我猜如果你正在做稀疏线性代数,而不是迟一点,你会希望获得每一点加速,所以我只能坚持使用C ++。 除非快速测试一个原型,否则我已经看不到使用Python的一个要点,而原型已经在C ++中完成了。

    链接地址: http://www.djcxy.com/p/62975.html

    上一篇: Python vs. C++ for an application that does sparse linear algebra

    下一篇: Finite Field Linear Algebra Library for Haskell