Python 使用Symphy';s solve函数(幕后发生了什么?)

Python 使用Symphy';s solve函数(幕后发生了什么?),python,sympy,Python,Sympy,我有一个Python代码,它解决了一个3变量的线性方程 import numpy as np from sympy import * init_printing(use_latex='mathjax') A = Matrix([[-2,3,-1],[2,2,3],[-4,-1,1]]) x,y,z= symbols('x,y,z') In[12]: X =Matrix([[x],[y],[z]]) B = Matrix([[1],[1],[1]]) solve(A*X-B) 我

我有一个Python代码,它解决了一个3变量的线性方程

import numpy as np

from sympy import *

init_printing(use_latex='mathjax')

A = Matrix([[-2,3,-1],[2,2,3],[-4,-1,1]])

x,y,z= symbols('x,y,z')
In[12]:

X =Matrix([[x],[y],[z]])

B = Matrix([[1],[1],[1]])

solve(A*X-B)

我对这一结果感到高兴和困惑。我想了解sympy解决这个问题的步骤,以及它使用的是什么解算器

问题的第一部分是上文中的Symphy Solution是如何解决的


第2部分:一般来说,有没有一种方法可以查看任何python程序的反汇编(为了理解它)

有两种基本方法:

读取源文件

理解它的最好方法是阅读源代码。在IPython中,您可以键入
solve???
,它将显示源代码以及源代码所在的文件。你也可以看看

Symphy中的求解有点复杂,因为它可以求解许多不同类型的方程。我相信在这种情况下,你要看看,它使用行减少。这将在未来的版本中被替换,该版本基本上使用相同的算法(高斯-乔丹消去法)

使用可视化调试器


理解发生了什么的另一种方法是在可视化调试器中单步执行代码。我推荐一个调试器,它可以向您显示正在运行的函数的代码、变量列表及其值(pdb在这方面不是一个很好的调试器)。我个人更喜欢在航站楼运行的PuDB,但也有其他好的。使用调试器的优点是,您可以准确地看到正在遍历的代码路径以及每个步骤中变量的值

您可以
导入dis
,然后调用
dis.dis(solve)
,但这将为您提供,但不确定这正是您所要求的。事实上,我刚刚这样做了,
dis.dis(sympy.solve)
导致~2k行反汇编转储。当您无法访问源代码时,您还可以看看反汇编是一种解决方案,但SymPy是@soon,这部分是正确的。当(交叉)检查编译器优化级别效果时,反汇编(也)很方便。在可以通过编写内嵌汇编来加快程序速度的情况下,反汇编使实现可见。不过,我明白你的意思,我应该看看
symphy
的源代码。谢谢。@CoryKramer似乎
dis.show\u code()
在python中可用>=3.2我正在使用2.7。
dis.dis()
创建的反汇编转储的级别太低。我将尝试使用更高(更新)版本的python。谢谢。不要随便用dis拆开它。这太低级了,无法理解函数的算法。