Python 更快地打印 sympy 矩阵

标签 python performance matrix sympy

我的 Python 代码使用 LUsolve() 函数求解线性方程组。 这速度相当快。但问题是,即使变量数量很少,打印解决方案也需要很长时间。 这是我写的代码。

from sympy import * 
from tkinter.filedialog import asksaveasfilename
import tkinter as tk 
from tkinter import *
from tkinter import simpledialog

root = tk.Tk()
root.withdraw()
file_name = asksaveasfilename()
root.withdraw() 

niso=tk.simpledialog.askinteger("Value of Niso","Value of Niso:")
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,    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) ) )
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):
    b[i,0]=MM[0,0]*(1/(MA[i,0]*(RB[i,0]-R[0,i]))-1/(MX[i,0]*(-RB[i,0]+R[i+1,i])) )

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

X = ( A.LUsolve(b) )

with open(file_name, 'w') as logFile:
    for i in range(0,niso-1):        
        print(K[i,0],'=',X[i],file=logFile)
<小时/>

主要问题是向量X的元素由许多sympy符号和print()组成> 必须将它们转换为字符串。

有没有更快的方法来打印我的解决方案?

最佳答案

速度下降主要是由于 SymPy 试图对术语进行排序。您可以通过直接使用 sstr 函数和 order='none' 来禁用此功能。例如,对于我来说 niso = 5str(X) (print 默认使用 str)超过 1 秒,sstr(X, order='none') 需要 360 毫秒。

换句话说,使用print(K[i,0], '=', sstr(X[i], order='none'), file=logFile)

关于Python 更快地打印 sympy 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802583/

相关文章:

具有矩阵和向量的 R 循环 : better (faster) solutions?

python - 使用 Pyfoobar 将歌曲长度更改为数字

python - Numpy ndarray 中的成员资格检查

jQuery $(this) 与变量

r - 将大距离矩阵更改为只有三列

matlab - MATLAB中对矩阵元素求和的方法有哪些?

python - 在 matplotlib 中使用条件标记

python - 迭代大型数据框的有效方法

java - Java 静态调用比非静态调用更贵还是更便宜?

C++重复间接访问与直接访问