具有同质签名函数的 Numba 类型列表

Numba typed lists with homogeneous-signature functions

我有一些具有相同签名的 numba-jitted 事件函数,即:

from numba import jit

@jit("Tuple((float64,float64))(float64[::1])", nopython=True)
def event_1(y): 
    return 1.1, 1.2 # (random values for this example)

@jit("Tuple((float64,float64))(float64[::1])", nopython=True)
def event_2(y): 
    return 2.1, 2.2 # (random values for this example)

我的目标是创建一个 jitted-function,其中 returns 一个事件函数列表。 event_handler 输出应该是另一个缓存编译的 jitted 函数的输入,因此它的签名必须是固定的:

from numba.typed import List
@jit("ListType(FunctionType(Tuple((float64, float64))(float64[::1])))()", nopython=True)
def event_handler(): 
    return List([event_1, event_2])

但是,只有当 event_handler 返回的列表至少有两个不同的事件函数时,上面的代码才有效。如果列表只有 1 个事件函数项,或同一函数的多个项(例如,List([event_1])List([event_1, event_1])),则上面的代码无法编译并产生以下错误:

No conversion from ListType[type(CPUDispatcher(<function event_1 at 0x7f83c2a22430>))] to ListType[FunctionType[UniTuple(float64 x 2)(array(float64, 1d, C))]]

我认为原因是因为在后一种情况下,列表项类型设置为等于函数 CPUDispatcher 而不是类型化函数签名。我已经尝试 this 解决方案来初始化列表,但不幸的是它不起作用。

我该如何解决这个问题?我觉得奇怪的是,当提供两个不同的函数时,列表类型被正确推断,但每当给出单个项目时突然继承 CPUDispatcher 类型。

我找到了一个解决方案,它改进了列表参数的显式类型和 typed listempty_list 方法。参考我的原始 post,我可以使用 empty_list 方法初始化列表,将其签名作为参数传递(在任何 jitted 函数的范围之外定义):

from numba import types
from numba.typed import List

vector_sig = types.Array(dtype=types.float64, ndim=1, layout="C")
function_sig = types.FunctionType(types.Tuple((types.float64, types.float64))(vector_sig))

@jit("ListType(FunctionType(Tuple((float64, float64))(float64[::1])))()", nopython=True)
def event_handler(): 
    event_list = List.empty_list(function_sig)
    event_list.append(event_1)
    return event_list