索引时 Numba 类型发生变化

Numba type changes when indexing

我遇到了一个奇怪的问题。以下代码(函数的一部分)

@njit
def treedist(treedists, An, Bn, w, M, Theta):
    print(An)
    print(Bn)
    print(An[1])
    print(Bn[1])

打印以下内容:

[(0.0, 1), (1.0, 18.071077087009371), (0.0, 0)]
[(0.0, 1), (1.0, 25.897262991223062), (0.0, 0)]
(1.0, 18)
(1.0, 25)

出于某种原因,元组中第二个元素的 float64 被转换为 int64。谁能告诉我为什么会这样?

谢谢!

我认为问题如下 -- Numba 只能处理常量类型的列表,因此它会查看您的列表并检查第一个元素并查看其类型 (float64, int64)。你可以看看这个:

treedist.inspect_types()

treedist.inspect_llvm()

在 运行 函数之后。然后它对未来的类型做出假设。如果您将所有元组更改为具有一致的类型:

An = [(0.0, 1.0), (1.0, 18.071077087009371), (0.0, 0.0)]

当您打印 An[1] 时,您不会强制转换为 int。

如果您有一个类型不一致的项目列表,numba 将会失败(不幸的是,它正在默默地进行)。请参阅说明列表必须严格同构的文档:

http://numba.pydata.org/numba-doc/0.29.0/reference/pysupported.html#list

它不是 "rejecting" 您的元组的事实可能是因为它没有正确处理不遵循正确约定的复杂对象。