You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何sympy.Matrix.inv方法运行速度缓慢?

SymPy矩阵求逆速度慢的原因与解决办法

你这段代码里的3x3矩阵求逆之所以慢,核心原因是你在做符号运算,而非数值运算——这和你预期的“小矩阵求逆快”完全不是一个场景。

为什么这么慢?

SymPy的矩阵求逆是推导解析表达式:逆矩阵的每个元素都是分子分母包含多个符号变量的多项式分式,SymPy需要完成符号展开、合并同类项、分式化简等操作,这些步骤的计算量远大于NumPy等数值库的数值求逆(数值求逆只需要做浮点数运算)。哪怕是3x3的符号矩阵,背后的符号推导工作量也不小。

另外你用NumPy数组存储符号变量再转SymPy矩阵的方式,还会额外引入类型转换的开销,进一步拖慢速度。

优化方案

  • 直接用SymPy构建矩阵,去掉NumPy的中间步骤,减少不必要的开销:
import sympy as sp

# 直接生成10x3的符号矩阵
X = sp.Matrix(10, 3, lambda i, j: sp.Symbol(f'X{i}{j}'))
X_T_X = X.T @ X
print(X_T_X.inv())
  • 如果不需要解析解,改用数值运算:
    如果你的需求只是得到数值结果,别用SymPy,直接用NumPy处理数值矩阵,求逆速度会极快:
import numpy as np

X = np.random.rand(10, 3)  # 用随机数值代替符号变量
X_T_X = X.T @ X
print(np.linalg.inv(X_T_X))
  • 给符号变量添加假设,简化运算:
    如果必须保留符号运算,可以给符号变量添加实数、正数等假设,帮助SymPy更快完成化简:
import sympy as sp

# 给符号变量添加实数假设
X = sp.Matrix(10, 3, lambda i, j: sp.Symbol(f'X{i}{j}', real=True))
X_T_X = X.T @ X
print(X_T_X.inv())

内容的提问来源于stack exchange,提问作者Galen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:57:18