首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行稀疏线性代数的应用程序的Python与C++

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

Stack Overflow用户
提问于 2010-09-21 23:45:07
回答 5查看 3K关注 0票数 4

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

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

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

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

2)除了Boost之外,C++还推荐哪些库?我已经看到了许多具有C接口的库,但如果我能获得相对较好的性能,我还是希望能做一些复杂度较低的事情。

3)归根结底,就线性代数运算的运行时速度而言,Python是否可以与C++相比?我将需要做很多很多线性代数运算,如果速度减慢很明显,那么我可能甚至不应该尝试进行这种切换。

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

EN

回答 5

Stack Overflow用户

发布于 2010-09-22 01:26:03

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

让我解释一下。

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

代码语言:javascript
复制
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工具。只有在分析了代码之后,才应该编写实际的包装器external_svd

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

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

票数 7
EN

Stack Overflow用户

发布于 2010-09-22 00:31:41

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

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

  • C++:
    • 将强制您保持一个结构良好的程序
    • 可以非常容易地为高级语言(如python)进行包装,以确保快速测试(查看the python c api或python

  • Python:
    • 易于调试,但很容易导致结构不良的程序
    • 可以非常轻松地为测试导入数据
    • 有一些非常可靠的库,如scipy/numpy (顺便说一句,scipy也为线性Python使用BLAS

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

票数 4
EN

Stack Overflow用户

发布于 2010-09-22 01:41:41

2)看起来您正在寻找Eigen

3)我猜想,如果你在做稀疏线性代数,你迟早会想要得到你能得到的每一点速度,所以我还是坚持使用C++。我看不出使用Python来做这件事有什么意义,除非快速测试原型,不管怎样,您已经在C++中完成了这项工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3761994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档