gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:42 25 4
gpt4 key购买 nike

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

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

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

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

2) 除了 Boost 之外,C++ 还推荐哪些库?我见过各种带有 C 接口(interface)的库,但我还是想做一些复杂性较低的事情,前提是我能获得相对较好的性能。

3) 最终,就线性代数运算的运行时速度而言,Python 能否与 C++ 相媲美?我将需要做很多很多线性代数运算,如果减速很明显,那么我什至不应该尝试进行这种转换。

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

最佳答案

我的建议是在将算法翻译成任何其他语言之前在 Python 中对其进行全面测试(否则您将面临过早优化错误算法的风险)。为您的问题明确定义最佳接口(interface)后,您可以将其分解为外部代码。

让我解释一下。

假设您的最终算法包括采用(行、列、值)格式的一堆数字,然后计算相应稀疏矩阵的 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 包装器,它有效地计算给定格式(行、列、值)或任何 float 格式的矩阵的 svd。

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

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

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

关于c++ - 用于执行稀疏线性代数的应用程序的 Python 与 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3761994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com