# Numba crashing IPython kernel/python interpreter

**URL:** <https://numba.discourse.group/t/numba-crashing-ipython-kernel-python-interpreter/809>\
**Category:** Community Support\
**Created:** [July 18, 2021, 6:44pm UTC](https://numba.discourse.group/t/numba-crashing-ipython-kernel-python-interpreter/809 "2021-07-18T18:44:52Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![rynkk](https://yyz2.discourse-cdn.com/free1/user_avatar/numba.discourse.group/rynkk/32/360_2.png) [@rynkk](https://numba.discourse.group/u/rynkk)\
**Post date:** [July 18, 2021, 6:44pm UTC](https://numba.discourse.group/t/numba-crashing-ipython-kernel-python-interpreter/809/1 "2021-07-18T18:44:52Z")

</div>

Hey there,

as Numba sadly doesn’t support `np.nanmin` or `np.nanmax` for parallelization I (and someone else) tried to do it ourselves:

> **Code**
>
> ```auto
> import numpy as np
> import numba as nb
> from math import isnan, inf
> 
> @nb.njit(fastmath=True)
> def _minmax_nan(x):
> maximum = -inf
> minimum = inf
> for i in x:
> if not isnan(i):
> if i > maximum:
> maximum = i
> if i < minimum:
> minimum = i
> return minimum, maximum
> 
> @nb.njit(parallel=True)
> def _minmax_chunks_nan(x, chunk_ranges):
> overall_maxima = []
> overall_minima = []
> for i in nb.prange(chunk_ranges.shape[0]):
> start = chunk_ranges[i, 0]
> end = chunk_ranges[i, 1]
> chunk_minimum, chunk_maximum = _minmax_nan(x[start : end])
> overall_maxima.append(chunk_maximum)
> overall_minima.append(chunk_minimum)
> return min(overall_minima), max(overall_maxima)
> 
> def even_chunk_sizes(dividend, divisor):
> quotient, remainder = divmod(dividend, divisor)
> cells = [quotient for _ in range(divisor)]
> for i in range(remainder):
> cells[i] += 1
> return cells
> 
> def even_chunk_ranges(dividend, divisor):
> sizes = even_chunk_sizes(dividend, divisor)
> ranges = []
> start = 0
> for s in sizes:
> end = start + s
> ranges.append((start, end))
> start = end
> return ranges
> 
> def nanminmax_parallel(x, n_chunks):
> chunk_ranges = np.array([
> [start, end]
> for start, end
> in even_chunk_ranges(len(x), n_chunks)
> ], dtype=np.int64)
> return _minmax_chunks_nan(x, chunk_ranges)
> 
> ```

Doing things like this in the jupyter notebook is a sure way to kill the kernel:

```auto
arr = np.random.rand(10)
%timeit nanminmax_parallel(arr, 4)

```

Just calling the function in quick succession seems to cause a crash.

Can someone help with this issue? Why does it crash, seemingly by chance?  
Also, I’m pretty new to numba+JIT so any suggestions to improve this piece of code would be much appreciated.

Best regards

PS: relevant github with ipynb+binder: [GitHub - rynkk/misc-ipynbs](https://github.com/rynkk/misc-ipynbs)

---

<div class="post-metadata">

**Author:** ![Rutger](https://yyz2.discourse-cdn.com/free1/user_avatar/numba.discourse.group/rutger/32/446_2.png) [@Rutger](https://numba.discourse.group/u/Rutger)\
**Post date:** [July 19, 2021, 7:14am UTC](https://numba.discourse.group/t/numba-crashing-ipython-kernel-python-interpreter/809/2 "2021-07-19T07:14:09Z")

</div>

Hey rynkk ,

I don’t think it’s related to Jupyter (or timeit). I get similar crashes when running it from a normal .py file. When doing so in a loop, it crashes after between 0 and 5 executions for me (judging by what it prints to the terminal).

This disappears when I disable parallel in your `_minmax_chunks_nan` function. Perhaps appending to a List in parallel is not supported?

Regards,  
Rutger

---

<div class="post-metadata">

**Author:** ![stuartarchibald](https://yyz2.discourse-cdn.com/free1/user_avatar/numba.discourse.group/stuartarchibald/32/10_2.png) [@stuartarchibald](https://numba.discourse.group/u/stuartarchibald)\
**Post date:** [July 19, 2021, 9:16am UTC](https://numba.discourse.group/t/numba-crashing-ipython-kernel-python-interpreter/809/3 "2021-07-19T09:16:44Z")

</div>

Hi @rynkk

@Rutger’s assessment is correct, the issue is that concurrent write operations on container types are not thread safe. The docs for the upcoming 0.54.0 release have this highlighted: [Automatic parallelization with @jit — Numba 0.54.0rc1+0.g9bed2ebb2.dirty-py3.7-linux-x86\_64.egg documentation](https://numba.readthedocs.io/en/0.54.0rc1/user/parallel.html#unsupported-operations)

---

<div class="post-metadata">

**Author:** ![rynkk](https://yyz2.discourse-cdn.com/free1/user_avatar/numba.discourse.group/rynkk/32/360_2.png) [@rynkk](https://numba.discourse.group/u/rynkk)\
**Post date:** [July 19, 2021, 9:42am UTC](https://numba.discourse.group/t/numba-crashing-ipython-kernel-python-interpreter/809/4 "2021-07-19T09:42:59Z")

</div>

Hi @stuartarchibald and @Rutger,  
thank you very much for the hint, I have altered `_minmax_chunks_nan` to this and now it works flawlessly:

```auto
@nb.njit(parallel=True)
def _minmax_chunks_nan(x, chunk_ranges):
    n_chunks = len(chunk_ranges)
    max_results = [-inf]*n_chunks
    min_results = [inf]*n_chunks
    for i in nb.prange(n_chunks):
        start = chunk_ranges[i, 0]
        end = chunk_ranges[i, 1]
        chunk_minimum, chunk_maximum = _minmax_nan(x[start : end])
        min_results[i] = chunk_minimum
        max_results[i] = chunk_maximum
            
    return min(min_results), max(max_results)

```
