Numba似乎反对元组中的负动态索引。

@jit
def test_fn():
    tup = (3,2,4,6,2)
    total = 0
    for idx in range(5):
        total += tup[-idx]
    return total


给出IndexError: tuple index out of range,但没有@jit装饰器当然可以。这是已知的/期望的/不可避免的行为吗?

最佳答案

这肯定看起来像是一个奇怪的错误。如果我对forceobj=True使用numba.jit参数,或者如果给locals传递了给定适当类型的任何局部变量tuptotalidx,则Numba函数将起作用。

更令人困惑的是,如果我只是简单地添加对numba.typeof(idx)的调用,那么它也可以工作,而无需在对jit的调用中添加额外的参数。不幸的是,当我使用这些修改从脚本的命令行运行numba --annotate时,看起来它们全部导致所有内容都被视为pyobject

numba 0.40.0就是全部。

以下是我在脚本中尝试过的一些更改:

# file 'test_numba.py'
import numba
import numpy as np

@numba.jit()
# @numba.jit(forceobj=True)
# @numba.jit(locals={'tup': tuple, 'idx': np.int64, 'total': np.int64})
#  also tried mixing and matching about 'locals' with and without the
#  numba.typeof calls below, and used `numba --annotate test_numba.py`
#  from command line to inspect annotated types.
def test_fn():
    tup = (3,2,4,6,2)
    total = 0
    print(numba.typeof(tup))
    print(numba.typeof(total))
    for idx in range(5):
        print(numba.typeof(idx))
        total += tup[-idx]
    return total

if __name__ == "__main__":
    test_fn()

关于python - Numba中的负动态指数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52777695/

10-15 12:40