Numba中的负动态指数

时间:2018-10-12 10:35:06

标签: python numba

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装饰器当然可以。这是已知/期望/不可避免的行为吗?

3 个答案:

答案 0 :(得分:2)

这绝对似乎是一个奇怪的错误。如果我使用forceobj=True的{​​{1}}参数,或者我使用任何局部变量numba.jitlocalstup传递total如果指定了适当的类型,则Numba函数将起作用。

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

这是numba 0.40.0的全部。

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

pyobject

答案 1 :(得分:1)

这确实很奇怪,与下面的代码相比,效果很好:

@jit(nopython=True)
def test_fn1():
    tup = (3, 2, 4, 6, 2)
    total = 0
    total += tup[-0]
    total += tup[-1]
    total += tup[-2]
    total += tup[-3]
    total += tup[-4]
return total

但是您的示例却没有(当idx为-1时,它就中断了),对我来说似乎是个错误。
numba 0.39.00.40.0都遇到这个问题。

答案 2 :(得分:-2)

对不起,在我以前的回答中,我有点困惑。 这有效:

@jit
def test_fn():
    tup = (3,2,4,6,2)
    total = 0
    for idx in tup: #changes have been made here
        total = total + idx #and here
    return total

旧答案:

  

代码无效:

     

def test_fn():           tup =(3,2,4,6,2)           总计= 0           对于范围(5)中的idx:               总数+ = tup [-(idx + 1)]#此处已进行更改           总回报   发生这种情况是因为索引“ -0”无效。 list(range(5))返回[0, 1, 2, 3, 4],因此-0将发生。该修补程序使其变为'-0'将变为'-1',因为这就是返回您想要的内容。

     

编辑:忘了提及索引-0实际上被接受为0,但这是无效的。