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
装饰器当然可以。这是已知/期望/不可避免的行为吗?
答案 0 :(得分:2)
这绝对似乎是一个奇怪的错误。如果我使用forceobj=True
的{{1}}参数,或者我使用任何局部变量numba.jit
,locals
或tup
传递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.0
和0.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,但这是无效的。