擅长:python、mysql、java
<p>好的,所以我在阅读了文献之后,又回到了这个问题上(这里重点强调),伯克维茨应该在O(n^2)和O(n^3)之间运行。在</p>
<p>我发现det和Poly的输入类型对性能有很大的影响(我承认在我的问题中没有显示输入类型)。将原始表达式包装在多边形中可显著提高性能。在</p>
<p>考虑以下三个代码</p>
<p>1:使用矩阵符号。det耗时1.1s,30分钟后仍停留在str上</p>
<pre><code>from sympy import MatrixSymbol, Matrix
X = MatrixSymbol('X', 10, 10)
Xmat = Matrix(X)
deter = Xmat.det(method='berkowitz')
str(deter)
</code></pre>
<p>2:表示我原来的问题代码。det花了1.8秒,30分钟后仍然停留在Poly上</p>
^{pr2}$
<p>3:以上,但带有<code>m[i,j] = poly(</code>。det取3.0s,Poly取0.04,nroots取0.27</p>
<pre><code>import sympy
from sympy import Matrix, I
from sympy import poly
from sympy.polys import Poly
matSz = 10
m = Matrix([[0.0]*matSz]*matSz)
x = sympy.symbols('x')
for i in range(matSz):
for j in range(matSz):
m[i,j] = poly(2.0*float(i+1)*x**2 + 2.0*float(j+1)*x*I - 5.0*float(i+1))
deter = m.det(method='berkowitz')
deter_poly = Poly(deter, x) #Required or exception
roots = deter_poly.nroots()
</code></pre>