<p><strong>The algorithm is just slow.</strong></p>
<p>Sympy explains <a href="http://docs.sympy.org/0.7.2/modules/matrices/matrices.html#sympy.matrices.matrices.MatrixBase.berkowitz" rel="nofollow noreferrer">the Berkowitz method in its documentation</a>, and references <a href="http://www.sciencedirect.com/science/article/pii/0020019084900188" rel="nofollow noreferrer">&quot;On computing the determinant in small parallel time using a small number of processors&quot;</a> ; for its implementation, <a href="http://docs.sympy.org/0.7.2/_modules/sympy/matrices/matrices.html#MatrixBase.berkowitz" rel="nofollow noreferrer">look at the open-source sympy code</a>.</p>
<p>The complexity of Berkowitz is pretty hard to understand, and it looks like if you don't want to brute force the proof of its correctness <a href="http://arxiv.org/pdf/math/0201315.pdf" rel="nofollow noreferrer">then you need to get involved in some pretty hairy combinatorics</a>.</p>
<p><em>The algorithm is fast for highly parrallized architectures</em>; it's mainly motivated by the fact that Gaussian Ellimination doesn't parralelize well. Formally, its in the <a href="https://en.wikipedia.org/wiki/NC_%28complexity%29#The_NC_hierarchy" rel="nofollow noreferrer">class <code>NC^2</code></a>. I might guess that your tests weren't being run on such an architecture. Some researchers into the algorithm <a href="https://cstheory.stackexchange.com/questions/12448/smallest-known-formula-for-the-determinant">seem to be contributors on CS.SE</a>, if you have more questions on that topic.</p>
<p><strong>The Polynomial Call is Slow</strong></p>
<p><a href="http://docs.sympy.org/0.6.7/modules/polynomials.html#sympy.polys.Poly" rel="nofollow noreferrer">From the docs</a>, there are multiple ways of constructing a polynomial, dependent on what type of collection is passed into the constructor (list <code>[1]</code>, tuple <code>[2]</code>, or dictionary <code>[3]</code>); they result in different validation and have very different performance. I would point you to this note in that documentation (emphasis mine, capitalization their's):</p>
<blockquote>
<p>For interactive usage choose <code>[1]</code> as it’s safe and relatively fast.</p>
<p>CAUTION: Use <code>[2]</code> or <code>[3]</code> internally for time critical algorithms, when
you know that coefficients and monomials will be valid sympy
expressions. Use them with caution! If the coefficients are integers
instead of sympy integers (e.g. 1 instead of S(1)) <strong>the polynomial will
be created but you may run into problems if you try to print the
polynomial</strong>. If the monomials are not given as tuples of integers you
will have problems.</p>
</blockquote>
<hr />
<p>Sympy also reserves the right to lazily evaluate expressions until their output is needed. This is a significant part of the benefit of symbolic calculations - mathematical simplification can result in precision gains and performance gains, but it also may mean that the actual evaluation of complex expressions may be delayed until unexpected times.</p>
Sympy never returns when processing complicated determinants
<p>At least this it how it appears. The following code behaved correctly for 3x3 and 6x6 matrices.</p>

<pre><code>    deter = mat.det('method':'berkowitz')
    #self.resultFileHandler.writeLogStr(str(deter))
    a = sy_polys.Poly(deter, k)
</code></pre>

<p>For 3x3 it takes ~0.8s to execute this code, for 6x6 it takes ~288s (with only 650ms for the det function, the rest for the Poly). For 10x10, either the complexity has ramped at a colossal rate or some other reason is preventing it returning from the Poly call (I waited a week). No exceptions are thrown.</p>

<p>The elements of the determinants consist of large symbolic polynomials.</p>

<p>I was on 0.7.1 and just upgraded to 1.0 (problem in both versions).</p>

<p>I added the logging to try and get the determinant to file but it sticks again in the str(deter) function call. If I break my debugger can't display the deter (prob too large for the debugger). </p>

<p>Here is a stack:</p>

<pre><code>MainThread - pid_135368_id_42197520 
  _print [printer.py:262]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  parenthesize [str.py:29]  
  _print_Mul [str.py:290]   
  _print [printer.py:257]   
  _print_Add [str.py:56]    
  _print [printer.py:257]   
  doprint [printer.py:233]  
  sstr [str.py:748] 
  __str__ [basic.py:396]    
  _getRoots_sympy_Poly_nroots [__init__.py:91]  
  getRoots [__init__.py:68] 
  findPolyRoots [__init__.py:697]   
  _getNroots [polefinder.py:97] 
  _doForN [polefinder.py:60]    
  _incN [polefinder.py:52]  
  __init__ [polefinder.py:39]   
  _doPoleFind [polefinderwrap.py:33]    
  _polesForPos [polefinderwrap.py:47]   
  &lt;module&gt; [polefinderwrap.py:60]   
  run [pydevd.py:937]   
  &lt;module&gt; [pydevd.py:1530] 
</code></pre>

<p>OK, I've got an exception from the str function. Seems likely that the polynomial has become too large.</p>

<pre><code>Traceback (most recent call last):
  File "E:\Peter's Documents\PhD\Code\Git\ProtoQScat\multichannel\qscat\ratsmat.\polefinder.py", line 60, in _doForN
    roots = self._getNroots(N)
  File "E:\Peter's Documents\PhD\Code\Git\ProtoQScat\multichannel\qscat\ratsmat.\polefinder.py", line 97, in _getNroots
    roots = ratSmat.findPolyRoots(False)
  File "E:\Peter's Documents\PhD\Code\Git\ProtoQScat\multichannel\qscat\numerical/..\ratsmat\__init__.py", line 697, in findPolyRoots
    roots = self.polyRootSolve.getRoots(mat, k)
  File "E:\Peter's Documents\PhD\Code\Git\ProtoQScat\multichannel\qscat\numerical/..\ratsmat\__init__.py", line 68, in getRoots
    ret = self._getRoots_sympy_Poly_nroots(mat, k)
  File "E:\Peter's Documents\PhD\Code\Git\ProtoQScat\multichannel\qscat\numerical/..\ratsmat\__init__.py", line 91, in _getRoots_sympy_Poly_nroots
    self.resultFileHandler.writeLogStr(str(deter))
  File "C:\Python27\lib\site-packages\sympy\core\basic.py", line 396, in __str__
    return sstr(self, order=None)
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 748, in sstr
    s = p.doprint(expr)
  File "C:\Python27\lib\site-packages\sympy\printing\printer.py", line 233, in doprint
    return self._str(self._print(expr))
  File "C:\Python27\lib\site-packages\sympy\printing\printer.py", line 257, in _print
    return getattr(self, printmethod)(expr, *args, **kwargs)
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 56, in _print_Add
    t = self._print(term)
  File "C:\Python27\lib\site-packages\sympy\printing\printer.py", line 257, in _print
    return getattr(self, printmethod)(expr, *args, **kwargs)
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 290, in _print_Mul
    a_str = [self.parenthesize(x, prec) for x in a]
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 29, in parenthesize
    return "(%s)" % self._print(item)
  File "C:\Python27\lib\site-packages\sympy\printing\printer.py", line 257, in _print
    return getattr(self, printmethod)(expr, *args, **kwargs)
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 56, in _print_Add
    t = self._print(term)
  File "C:\Python27\lib\site-packages\sympy\printing\printer.py", line 257, in _print
    return getattr(self, printmethod)(expr, *args, **kwargs)
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 290, in _print_Mul
    a_str = [self.parenthesize(x, prec) for x in a]
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 29, in parenthesize
    return "(%s)" % self._print(item)
  File "C:\Python27\lib\site-packages\sympy\printing\printer.py", line 257, in _print
    return getattr(self, printmethod)(expr, *args, **kwargs)
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 56, in _print_Add
    t = self._print(term)
  File "C:\Python27\lib\site-packages\sympy\printing\printer.py", line 257, in _print
    return getattr(self, printmethod)(expr, *args, **kwargs)
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 290, in _print_Mul
    a_str = [self.parenthesize(x, prec) for x in a]
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 29, in parenthesize
    return "(%s)" % self._print(item)
  File "C:\Python27\lib\site-packages\sympy\printing\printer.py", line 257, in _print
    return getattr(self, printmethod)(expr, *args, **kwargs)
  File "C:\Python27\lib\site-packages\sympy\printing\str.py", line 69, in _print_Add
    return sign + ' '.join(l)
MemoryError
</code></pre>

<p>EDIT:
Following from answer below here is a profile plot with the determinant size (channel). Ignore N (on y axis) it is another parameter of the calculation (governs the size of the polys in the elements).
<a href="https://i.stack.imgur.com/2lyBO.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/2lyBO.png" alt="enter image description here"></a></p>