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

Python np.linalg.solve和scipy.linalg.cho_solve之间的性能差距,python,numpy,scipy,linear-algebra,Python,Numpy,Scipy,Linear Algebra,我试图通过求解两个涉及Cholesky分解的线性方程组来找到alphascipy有一个特殊的功能来执行此操作。scipy和numpy之间存在显著的性能差距。我是否可以通过任何其他方式实现与numpy中的scipy一样好的性能?(假设不允许我使用scipy) 将numpy导入为np 进口西皮 def numpy_cho_solve(N,M): 对于范围(N)内的种子: np.随机种子(种子) x=np.rand.rand(M,1) y=np.rand.rand(M,1) k=x@x.T+np.眼(

我试图通过求解两个涉及Cholesky分解的线性方程组来找到alpha
scipy
有一个特殊的功能来执行此操作。
scipy
numpy
之间存在显著的性能差距。我是否可以通过任何其他方式实现与
numpy
中的
scipy
一样好的性能?(假设不允许我使用scipy)

将numpy导入为np
进口西皮
def numpy_cho_solve(N,M):
对于范围(N)内的种子:
np.随机种子(种子)
x=np.rand.rand(M,1)
y=np.rand.rand(M,1)
k=x@x.T+np.眼(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):
对于范围(N)内的种子:
np.随机种子(种子)
x=np.rand.rand(M,1)
y=np.rand.rand(M,1)
k=x@x.T+np.眼(M)#M*M
L=np.linalg.cholesky(k)
alpha=scipy.linalg.cho_solve((L,真),y)
%timeit numpy_cho_solve(100100)
%timeit scipy_cho_求解(100100)
输出

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)

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

Cholesky分解法的前向和后向替换步骤非常快,但不可矢量化,因此
numpy
没有多大帮助。您需要一个编译函数(如
scipy
implements),但如果您不能使用
scipy
,我怀疑您是否可以使用
numba
(它通常用于为
numpy
生成c编译函数)


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

您能告诉我
scipy
到底做了什么,从而提高了性能吗?如果可能的话,我愿意使用
numpy
编写相同的代码,或者我应该查看
scipy
的源代码吗?
scipy
使用编译函数,该函数是用
c
编写的。Python是一种解释语言,而不是编译语言。因此,除非您能够1)编写和编译一个可从
python
调用的
c
函数,或者2)使用
numba
来执行此操作,否则您不能执行与
scipy
相同的操作。您可以通过一个示例演示
inv
transpose
的帮助吗?