如何在Numba中向列表追加字符串、整型、浮点型混合类型数据?
问题原因
Numba的nopython模式要求List中所有元素的类型必须完全一致,你尝试追加的列表同时包含整型、字符串、浮点型三类异构数据,Numba无法自动推断出统一的元素类型,因此触发TypingError。
解决方案
方案1:拆分存储+外部拼接(推荐,实现最简单,性能损失可忽略)
耗时最高的相似度矩阵遍历逻辑已经由Numba加速完成,你可以先在Numba函数内仅存储可被类型识别的数值类结果,返回Python普通环境后再匹配对应的文本内容即可:
import numba from numba.typed import List import numpy as np @numba.jit(nopython=True) def similarity(nid, cos_sim, threshold): numba_list = List() for i in range(cos_sim.shape[0]): for index in range(i, cos_sim.shape[1]): if cos_sim[i][index] > threshold and i != index: # 仅存可被类型推断的ID、相似度数值 numba_list.append((nid[i], nid[index], cos_sim[i][index])) return numba_list # 调用函数获取数值结果 res_num = similarity(idd, cos_sim, 0.85) # 在Python环境中拼接文本,生成你需要的最终格式 # 先做ID到文本的映射字典,加速匹配 id_to_txt = dict(zip(idd, txt)) final_res = [] for src_id, dst_id, score in res_num: final_res.append([src_id, id_to_txt[src_id], dst_id, id_to_txt[dst_id], score]) print(final_res)
方案2:预定义异构结构(适合必须在Numba内部完成全流程的场景)
你可以提前通过numba.experimental.structref定义固定字段类型的结构体,让Numba可以提前推断元素类型,即可在List中存储混合类型的结构:
from numba import types from numba.experimental import structref # 定义结构体字段类型 @structref class SimilarPair(types.StructRef): def __init__(self, src_id, src_txt, dst_id, dst_txt, score): pass # 定义字段对应的类型 fields = [ ('src_id', types.int64), ('src_txt', types.unicode_type), ('dst_id', types.int64), ('dst_txt', types.unicode_type), ('score', types.float32) ] StructType = structref.define_proxy(SimilarPair, fields) @numba.jit(nopython=True) def similarity(nid, txxt, cos_sim, threshold): numba_list = List() for i in range(cos_sim.shape[0]): for index in range(i, cos_sim.shape[1]): if cos_sim[i][index] > threshold and i != index: # 用预定义的结构体存混合类型数据 pair = StructType(nid[i], txxt[i], nid[index], txxt[index], cos_sim[i][index]) numba_list.append(pair) return numba_list
内容的提问来源于stack exchange,提问作者vivek
相关产品推荐
相关产品推荐

