1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
Description: Allow some numba errors on non-amd64, warn on non-x86
Specifying the exception type allows only explicit errors,
not silently wrong answers
Numba has been observed to give wrong answers on mipsel,
and crash on armel (LLVM ERROR) and s390x (segfault).
Author: Rebecca N. Palmer <rebecca_palmer@zoho.com>
Forwarded: no
--- a/pandas/tests/window/test_numba.py
+++ b/pandas/tests/window/test_numba.py
@@ -6,9 +6,18 @@ import pandas.util._test_decorators as t
from pandas import Series, option_context
import pandas._testing as tm
from pandas.core.util.numba_ import NUMBA_FUNC_CACHE
+from pandas.compat import is_platform_32bit, is_platform_little_endian
+import platform
+import sys
+try:
+ from numba.core.errors import UnsupportedParforsError
+except ImportError:
+ UnsupportedParforsError = ImportError
@td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=is_platform_32bit(), raises=UnsupportedParforsError, reason="some Numba functionality is not available on 32 bit systems", strict=False)
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
@pytest.mark.filterwarnings("ignore:\\nThe keyword argument")
# Filter warnings when parallel=True and the function can't be parallelized by Numba
class TestApply:
@@ -37,6 +46,7 @@ class TestApply:
)
tm.assert_series_equal(result, expected)
+ @pytest.mark.xfail(condition='mips' in platform.uname()[4].lower() and sys.maxsize<2**33, reason="Numba may give wrong answers on mipsel", strict=False)
@pytest.mark.parametrize("jit", [True, False])
def test_cache(self, jit, nogil, parallel, nopython):
# Test that the functions are cached correctly if we switch functions
@@ -78,6 +88,7 @@ class TestApply:
@td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
def test_use_global_config():
def f(x):
return np.mean(x) + 2
--- a/pandas/tests/window/conftest.py
+++ b/pandas/tests/window/conftest.py
@@ -5,6 +5,7 @@ from numpy.random import randn
import pytest
import pandas.util._test_decorators as td
+from pandas.compat import is_platform_little_endian
from pandas import DataFrame, Series, bdate_range, notna
@@ -85,7 +86,7 @@ def engine(request):
@pytest.fixture(
params=[
- pytest.param(("numba", True), marks=td.skip_if_no("numba", "0.46.0")),
+ pytest.param(("numba", True), marks=[pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False),td.skip_if_no("numba", "0.46.0")]),
("cython", True),
("cython", False),
]
--- a/pandas/core/window/numba_.py
+++ b/pandas/core/window/numba_.py
@@ -4,6 +4,10 @@ import numpy as np
from pandas._typing import Scalar
from pandas.compat._optional import import_optional_dependency
+import platform
+import re
+import warnings
+warn_numba_platform = "Non-x86 system detected, Numba may give wrong results or crash" if not bool(re.match('i.?86|x86',platform.uname()[4])) else False
from pandas.core.util.numba_ import (
check_kwargs_and_nopython,
@@ -49,6 +53,8 @@ def generate_numba_apply_func(
numba_func = jit_user_function(func, nopython, nogil, parallel)
numba = import_optional_dependency("numba")
+ if warn_numba_platform:
+ warnings.warn(warn_numba_platform)
if parallel:
loop_range = numba.prange
--- a/pandas/tests/groupby/transform/test_numba.py
+++ b/pandas/tests/groupby/transform/test_numba.py
@@ -6,6 +6,7 @@ import pandas.util._test_decorators as t
from pandas import DataFrame, option_context
import pandas._testing as tm
from pandas.core.util.numba_ import NUMBA_FUNC_CACHE
+from pandas.compat import is_platform_little_endian
@td.skip_if_no("numba", "0.46.0")
@@ -41,6 +42,7 @@ def test_check_nopython_kwargs():
@td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
@pytest.mark.filterwarnings("ignore:\\nThe keyword argument")
# Filter warnings when parallel=True and the function can't be parallelized by Numba
@pytest.mark.parametrize("jit", [True, False])
@@ -70,6 +72,7 @@ def test_numba_vs_cython(jit, pandas_obj
@td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
@pytest.mark.filterwarnings("ignore:\\nThe keyword argument")
# Filter warnings when parallel=True and the function can't be parallelized by Numba
@pytest.mark.parametrize("jit", [True, False])
@@ -115,6 +118,7 @@ def test_cache(jit, pandas_obj, nogil, p
@td.skip_if_no("numba", "0.46.0")
+@pytest.mark.xfail(condition=not is_platform_little_endian(), reason="Numba may crash on s390x", run=False, strict=False)
def test_use_global_config():
def func_1(values, index):
return values + 1
|