我正在编写一个应用程序,其中相当多的计算时间将用于执行基本的线性代数运算(加、乘、乘向量、乘标量等)。关于稀疏矩阵和向量。到目前为止,我们已经使用C++和Boost矩阵库构建了一个原型。
我正在考虑改用Python,以简化应用程序本身的编码,因为Boost库( easy C++线性代数库)似乎并不是特别快。这是一个研究/概念证明的应用程序,所以只要编码时间也显著减少,运行时速度的降低是可以接受的(我假设C++几乎总是优于Python)。
基本上,我是从以前使用过这些库的人那里寻求一般的建议。但具体来说:
1)我找到了scipy.sparse和pySparse。这些(或其他库)是推荐的吗?
2)除了Boost之外,C++还推荐哪些库?我已经看到了许多具有C接口的库,但如果我能获得相对较好的性能,我还是希望能做一些复杂度较低的事情。
3)归根结底,就线性代数运算的运行时速度而言,Python是否可以与C++相比?我将需要做很多很多线性代数运算,如果速度减慢很明显,那么我可能甚至不应该尝试进行这种切换。
提前感谢您的任何帮助和以前的经验,您可以联系。
发布于 2010-09-22 01:26:03
我的建议是,在将算法翻译成任何其他语言之前,先用Python对算法进行全面测试(否则就会冒着过早优化糟糕算法的风险)。一旦明确定义了解决问题的最佳接口,就可以将其分解为外部代码。
让我解释一下。
假设您的最终算法包含一组(行、列、值)格式的数字,并计算相应稀疏矩阵的奇异值分解。然后,您可以将整个接口留给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。
同样,首先尝试使用numpy和scipy,以及任何其他标准Python工具。只有在分析了代码之后,才应该编写实际的包装器external_svd。
如果你走这条路,你将拥有一个用户友好的模块(用户与Python交互,而不是与Fotran/C/C++交互),最重要的是,你将能够使用不同的后端:external_svd_lapack、external_svd_paradiso、external_svd_gsl等(你选择的每个后端一个)。
至于稀疏线性代数库,请查看Intel Math Kernel Library、PARADISO sparse solver、名为"MA27“的Harwell Subroutine Library (HSL)。我已经成功地使用它们解决了非常稀疏、非常大的问题(请查看非线性优化求解器IPOPT的页面,了解我的意思)
发布于 2010-09-22 00:31:41
正如llasram所说,python中的许多库都是用C/C++编写的,因此python应该以可接受的速度运行。
在C++上,您也可以测试gsl (gnu科学库),但我相信线性代数的例程将与Boost相同(这两个库都使用BLAS )。对于稀疏线性代数,你应该看看SBLAS,但我从来没有用过它。下面是我看到的一个简短的“利弊”:
我个人使用gsl进行矩阵操作,并将我的C++库包装到Python库中,以便轻松地使用数据进行测试。在我看来,这是一种结合两种语言优点的方式。
发布于 2010-09-22 01:41:41
2)看起来您正在寻找Eigen。
3)我猜想,如果你在做稀疏线性代数,你迟早会想要得到你能得到的每一点速度,所以我还是坚持使用C++。我看不出使用Python来做这件事有什么意义,除非快速测试原型,不管怎样,您已经在C++中完成了这项工作。
https://stackoverflow.com/questions/3761994
复制相似问题