首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >np.linalg.solve和scipy.linalg.cho_solve之间的性能差距

np.linalg.solve和scipy.linalg.cho_solve之间的性能差距
EN

Stack Overflow用户
提问于 2021-02-26 16:21:07
回答 2查看 241关注 0票数 1

我试图通过求解两个涉及乔列斯基分解的线性方程组来寻找alphascipy有一个特殊的函数可以做到这一点。scipynumpy之间存在着显著的性能差距。我可以通过其他方式在numpy中获得和scipy一样好的性能吗?(假设不允许我使用scipy)。

代码语言:javascript
复制
import numpy as np
import scipy

def numpy_cho_solve(N,M):
    for seed in range(N):
        np.random.seed(seed)
        x = np.random.rand(M,1)
        y = np.random.rand(M,1)
        k = x@x.T + np.eye(M)# M*M
        L = np.linalg.cholesky(k)
        alpha = np.linalg.solve(L.T, np.linalg.solve(L, y))
        
def scipy_cho_solve(N,M):
    for seed in range(N):
        np.random.seed(seed)
        x = np.random.rand(M,1)
        y = np.random.rand(M,1)
        k = x@x.T + np.eye(M)# M*M
        L = np.linalg.cholesky(k)
        alpha = scipy.linalg.cho_solve((L,True), y)

%timeit numpy_cho_solve(100,100)
%timeit scipy_cho_solve(100,100)

输出

代码语言:javascript
复制
317 ms ± 12.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
76.9 ms ± 3.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-26 17:47:46

Cholesky分解方法的前向和后向替换步骤非常快,但不能向量化,因此numpy不能提供太多帮助。你需要一个编译过的函数(作为scipy的实现)--但是如果你不能使用scipy,我怀疑你能不能使用numba (它通常用于为numpy生成c编译的函数)。

np.linalg.solve试图通过天真地应用LU替换来解决简单的向前替换步骤,因此它比专门构建的函数(甚至根本不使用Cholesky )所需的时间要长得多。

票数 1
EN

Stack Overflow用户

发布于 2021-02-26 17:35:21

考虑到您只能使用numpy,那么np.linalg.solve是解线性方程的最佳函数,因为它可以给出准确的结果。你可以使用numpy的invtranspose函数,但准确的结果将是solve函数。

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

https://stackoverflow.com/questions/66382370

复制
相关文章

相似问题

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