Python 加速辛矩阵运算

Python 加速辛矩阵运算,python,performance,matrix,sympy,Python,Performance,Matrix,Sympy,我已经编写了一个代码,它使用sympy来设置一个矩阵和一个向量。这两个元素是sympy符号。然后我将矩阵求逆,并将求逆的矩阵和向量相乘。这应该是具有n个变量的线性方程组的通用解算器。我对这些线性方程的符号解感兴趣。 问题是我的代码太慢了。 例如,对于n=4,大约需要30秒,但是对于n=7,我到目前为止还不能解决它,代码运行了一整晚(8小时),早上还没有完成。 这是我的密码 from sympy import * import pprint MM = Matrix(niso,1, lambd

我已经编写了一个代码,它使用
sympy
来设置一个矩阵和一个向量。这两个元素是
sympy
符号。然后我将矩阵求逆,并将求逆的矩阵和向量相乘。这应该是具有n个变量的线性方程组的通用解算器。我对这些线性方程的符号解感兴趣。 问题是我的代码太慢了。 例如,对于n=4,大约需要30秒,但是对于n=7,我到目前为止还不能解决它,代码运行了一整晚(8小时),早上还没有完成。 这是我的密码

from sympy import * 
import pprint 

MM = Matrix(niso,1, lambda i,j:var('MM_%s' % (i+1) ))
MA = Matrix (niso,1, lambda i,j:var('m_%s%s' % ('A', chr(66+i)) ) )
MX = Matrix (niso,1, lambda i,j:var('m_%s%s'% (chr(66+i), 'A')))
RB = Matrix(niso,1, lambda i,j:var('R_%s%s' % ('A'+chr(66+i),i+2)))
R = Matrix (niso, niso-1, lambda i,j: var('R_%s%d' % (chr(65+i) , j+2 )))
K= Matrix(niso-1,1, lambda i,j:var('K_%d' % (i+2) ) )
C= Matrix(niso-1,1, lambda i,j:var('A_%d' % i))

A = Matrix(niso-1,niso-1, lambda i,j:var('A_%d' % i))
b = Matrix(niso-1,1, lambda i,j:var('A_%d' % i))

for i in range(0,niso-1):
        for j in range(0,niso-1):
            A[i,j]=MM[j+1,0]*(Add(Mul(R[0,j],1/MA[i,0]/(RB[i,0]-R[0,i])))+R[i+1,j]/MX[i,0]/(-RB[i,0]+R[0,i]))

for i in range(0,niso-1):
    b[i,0]=MM[0,0]*(Add(Mul(1,1/MA[i,0]/(RB[i,0]-R[0,i])))+1/MX[i,0]/(-RB[i,0]+R[0,i]))


A_in = Inverse(A)
if niso <= 4:
    X =simplify(A_in*b)
if niso > 4:
    X = A_in*b
pprint(X)
从sympy导入*
导入pprint
MM=矩阵(niso,1,lambda i,j:var('MM_u%s'(i+1)))
MA=矩阵(niso,1,λi,j:var('m_%s%s'('A',chr(66+i)))
MX=矩阵(niso,1,λi,j:var('m_u%s%s'(chr(66+i),'A'))
RB=矩阵(niso,1,λi,j:var('R_u%s%s'('A'+chr(66+i),i+2)))
R=矩阵(niso,niso-1,λi,j:var('R_u%s%d'(chr(65+i),j+2)))
K=矩阵(niso-1,1,λi,j:var('K_Ud%d'(i+2)))
C=矩阵(niso-1,1,λi,j:var('A_u%d'%i))
A=矩阵(niso-1,niso-1,λi,j:var('A_u%d'%i))
b=矩阵(niso-1,1,λi,j:var('A_u%d'%i))
对于范围(0,niso-1)内的i:
对于范围内的j(0,niso-1):
A[i,j]=MM[j+1,0]*(加上(Mul(R[0,j],1/MA[i,0]/(RB[i,0]-R[0,i]))+R[i+1,j]/MX[i,0]/(-RB[i,0]+R[0,i]))
对于范围(0,niso-1)内的i:
b[i,0]=MM[0,0]*(添加(Mul(1,1/MA[i,0]/(RB[i,0]-R[0,i]))+1/MX[i,0]/(-RB[i,0]+R[0,i]))
A_in=逆(A)
如果是niso 4:
X=A_in*b
pprint(X)

有什么方法可以加速吗?

不要反转!使用
n=4

%timeit soln = A.LUsolve(b)
697 µs ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
使用
n=10

%timeit soln = A.LUsolve(b)
431 ms ± 13 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

是否有什么原因使您要反转矩阵而不是使用
solve
?反转是非常昂贵的,通常是不必要的。好吧,这工作得更好,但现在我的问题是,在文件中写入解决方案需要非常长的时间,因为str(soln)非常慢。还有其他方法吗?表达式非常大,所以我不认为有任何方法可以节省打印它们的费用。好的,所以将解决方案打印到文件是一个瓶颈,您认为或knwo是否有其他语言能够更快地完成这项工作?您可以尝试
symmengine
,它是专为Symphy设计的更快的核心。它是用C++编写的。我在
maxima
方面也有很好的经验。我不确定这两个选项中的任何一个在将大型表达式写入文件方面能为您带来什么。