You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Numba中使用只读字典作为输入?已尝试typed.Dict.empty但失效

在Numba中使用只读字典作为输入参数的正确方式

首先明确:你遇到的问题核心是Numba的typed.Dict不支持可变长度数组(uint8[:])作为键——因为可变长度数组属于引用类型,无法被哈希,而字典键必须是可哈希类型。下面是具体的解决思路和代码示例:

1. 替换键类型为可哈希的固定长度类型

如果你的UID数组长度固定(比如长度为4的uint8数组),可以用固定大小的数组类型作为键:

from numba import njit, types
from numba.typed import Dict

# 创建键类型为固定长度uint8数组(长度4)的字典
uid_dict = Dict.empty(types.uint8[4], types.int32)

# 填充示例数据
uid_dict[bytes([1,2,3,4])] = 100
uid_dict[bytes([5,6,7,8])] = 200

2. 将可变长度数组转为元组作为键

如果UID数组长度不固定,可先把数组转成元组(元组是可哈希的不可变类型):

# 创建键类型为uint8元组的字典
uid_dict = Dict.empty(types.UniTuple(types.uint8, 4), types.int32)

# 填充数据时转成元组
uid = np.array([1,2,3,4], dtype=np.uint8)
uid_dict[tuple(uid)] = 100

3. 标记字典为只读(避免函数内修改)

在Numba函数中,若想让字典作为只读输入,可通过njit的readonly参数声明(Numba 0.57+支持):

@njit(readonly={'uid_map': True})
def process_uids(uids, uid_map):
    result = np.zeros(len(uids), dtype=np.int32)
    for i in range(len(uids)):
        uid_key = tuple(uids[i])
        if uid_key in uid_map:
            result[i] = uid_map[uid_key]
        else:
            result[i] = -1
    return result

完整可运行示例

import numpy as np
from numba import njit, types
from numba.typed import Dict

# 初始化字典,用元组作为键
uid_dict = Dict.empty(types.UniTuple(types.uint8, 4), types.int32)
uid_dict[(1,2,3,4)] = 100
uid_dict[(5,6,7,8)] = 200

# 定义只读字典的处理函数
@njit(readonly={'uid_map': True})
def process_uids(uids, uid_map):
    result = np.zeros(len(uids), dtype=np.int32)
    for idx in range(len(uids)):
        current_uid = tuple(uids[idx])
        result[idx] = uid_map.get(current_uid, -1)
    return result

# 测试数据
test_uids = np.array([[1,2,3,4], [9,10,11,12], [5,6,7,8]], dtype=np.uint8)
output = process_uids(test_uids, uid_dict)
print(output)  # 输出: [100 -1 200]

关键注意事项

  • Numba typed.Dict的键必须是不可变、可哈希的类型,比如基本类型(int, float)、固定大小数组、元组,不支持可变长度数组(uint8[:])。
  • 使用readonly={'dict_name': True}可以确保函数内无法修改字典,避免意外修改输入数据。
  • 如果UID数组长度不固定,建议先将其转换为固定长度(比如补零)或者计算数组的哈希值作为键(注意哈希冲突风险)。

内容的提问来源于stack exchange,提问作者Galaxy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:29:53