1

我编写了这个包装器以根据可用性(“可以numba导入吗?”)和用户设置(“是否numba_enabled()返回 True?”)来使用 numba。

这对于测试特别有用,我想在有和没有 numba 的情况下运行测试。

def try_numba_autojit(func):
    def func_(*args):
        if numba_enabled():
            try:
                import numba
            except:
                pass
            else:
                return numba.autojit(func)(*args)
        return func(*args)
    return func_

问题:包装器导致原本可以抛出此错误的函数:

*** OverflowError: can't convert negative value to unsigned char

如果我设置try_numba_autojit = numba.autojit,覆盖包装器,则没有错误。我的结论是 *args 可能正在做一些 numba 不喜欢的事情。

在 pdb 中,我尝试手动解压缩 args:

(Pdb) numba.autojit(func)
<specializing numba function(<function _refine at 0xa53ec6c>)>
(Pdb) numba.autojit(func)(*args)
*** OverflowError: can't convert negative value to unsigned char

(Pdb) numba.autojit(func)(args[0], args[1], args[2], args[3], args[4], args[5], args[6])
*** OverflowError: can't convert negative value to unsigned char

这给出了同样的错误。

是否有推荐的定义一个函数try_numba_autojit来避免让 numba 不安?

4

1 回答 1

1

我不知道为什么您正在做的事情不起作用,但是如果您可以在包装时间而不是函数调用时间测试 numba-availibility/enability,这可能会起作用(未经测试,抱歉)

def try_numba_autojit():
    if numba_enabled():
        try:
            import numba
            return numba.autojit
        except ImportError:
            pass
    return lambda func: func

并使用:

@try_numba_autojit()
def f(a,b,c): ...
于 2014-01-27T20:11:57.563 回答