I tried to reproduce the slowdown you get with Numba, but this is as far as I got:

```
In [1]: from itertools import product
...: import numpy as np
...: def create_coefficients(max_range, functions):
...: for i in range(2, max_range):
...: functions.extend(list(product([1, -1], repeat=i + 1)))
...:
...:
...: def split_complex(functions, res1, res2):
...: for func in functions[0:(len(functions) // 2)]:
...: res = np.roots(func)
...: res1.extend([np.real(ele) for ele in res])
...: res2.extend([np.imag(ele) for ele in res])
...:
In [2]: functions = []
...: create_coefficients(15, functions)
In [3]: from numba import njit
In [4]: nsc = njit(split_complex)
In [5]: %timeit res1 = []; res2 = []; split_complex(functions, res1, res2)
3.48 s ± 253 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [6]: %timeit res1 = []; res2 = []; nsc(functions, res1, res2)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-6-48f9ca6fedd2> in <module>
----> 1 get_ipython().run_line_magic('timeit', 'res1 = []; res2 = []; nsc(functions, res1, res2)')
~/miniconda3/envs/numba_3.8/lib/python3.8/site-packages/IPython/core/interactiveshell.py in run_line_magic(self, magic_name, line, _stack_depth)
2324 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2325 with self.builtin_trap:
-> 2326 result = fn(*args, **kwargs)
2327 return result
2328
~/miniconda3/envs/numba_3.8/lib/python3.8/site-packages/decorator.py in fun(*args, **kw)
229 if not kwsyntax:
230 args, kw = fix(args, kw, sig)
--> 231 return caller(func, *(extras + args), **kw)
232 fun.__name__ = func.__name__
233 fun.__doc__ = func.__doc__
~/miniconda3/envs/numba_3.8/lib/python3.8/site-packages/IPython/core/magic.py in <lambda>(f, *a, **k)
185 # but it's overkill for just that one bit of state.
186 def magic_deco(arg):
--> 187 call = lambda f, *a, **k: f(*a, **k)
188
189 if callable(arg):
~/miniconda3/envs/numba_3.8/lib/python3.8/site-packages/IPython/core/magics/execution.py in timeit(self, line, cell, local_ns)
1167 for index in range(0, 10):
1168 number = 10 ** index
-> 1169 time_number = timer.timeit(number)
1170 if time_number >= 0.2:
1171 break
~/miniconda3/envs/numba_3.8/lib/python3.8/site-packages/IPython/core/magics/execution.py in timeit(self, number)
167 gc.disable()
168 try:
--> 169 timing = self.inner(it, self.timer)
170 finally:
171 if gcold:
<magic-timeit> in inner(_it, _timer)
ValueError: cannot compute fingerprint of empty list
```