如何为参数含NamedUniTuple的numba函数编写更简洁的签名?
关于numba NamedUniTuple签名指定的相关问题解答
更简洁的签名指定方案
有两种可行的方案可以避免每次手动计算字段长度:
- 方案1:封装辅助构造函数,统一处理长度计算逻辑,适合确实需要手动指定签名的场景
from typing import NamedTuple import numba as nb def get_named_uni_tuple_type(dtype, py_namedtuple_cls): return nb.types.NamedUniTuple(dtype, len(py_namedtuple_cls._fields), py_namedtuple_cls) class A(NamedTuple): a: float b: float # 直接传入自定义的NamedTuple类即可,不需要手动写长度 @nb.njit(nb.float64(get_named_uni_tuple_type(nb.float64, A))) def f(x: A) -> float: return x.a + x.b
- 方案2:完全放弃手动指定签名,用numba的自动类型推导。numba原生支持识别Python标准的
typing.NamedTuple和collections.namedtuple类型,不需要手动声明NamedUniTuple,这也是最稳妥的公开API用法:
@nb.njit def f(x: A) -> float: return x.a + x.b
为什么NamedUniTuple不能自动计算长度
NamedUniTuple是通用的命名元组类型构造器,设计上支持两种用法:一种是传入Python侧的命名元组类绑定字段信息,另一种是直接传入自定义字段名列表作为第三个参数。因此长度参数是必填项,无法默认从第三个参数自动推断,否则会破坏第二种用法的兼容性。
NamedUniTuple是否为非公开API
是的,NamedUniTuple属于numba的内部非公开API,没有纳入官方公开文档的说明范围,不保证后续版本的接口兼容性,非必要场景不推荐直接使用。
内容的提问来源于stack exchange,提问作者yt87
相关产品推荐
相关产品推荐

