如何使用 Numba 追加 String Int 和 Float 类型的列表
How to Append list of type String Int and Float using Numba
我正在使用 Numba 来提高下面循环的速度。没有 Numba 执行需要 135 秒,使用 Numba 需要 0.30 秒 :) 这非常快。
在下面的循环中,我将数组与阈值 0.85 进行了比较。如果条件为真,我会将数据插入函数返回的列表中。
插入到列表中的数据如下所示。
['Source ID', 'Source TEXT', 'Similar ID', Similar TEXT, 'Score']
idd = df['ID'].to_numpy()
txt = df['TEXT'].to_numpy()
Column = 'TEXT'
df = preprocessing(dataresult, Column) # removing special characters of 'TEXT' column
message_embeddings = model_url(np.array(df['DescriptionNew'])) #passing df to universal sentence encoder model to create sentence embedding.
cos_sim = cosine_similarity(message_embeddings) #len(cos_sim) > 8000
# Below function finds duplicates amoung rows.
@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) & (i!=index):
numba_list.append([nid[i], nid[index], cos_sim[i][index]]) # either this works
# numba_list.append([txxt[i], txxt[index]]) # or either this works
# numba_list.append([nid[i], txxt[i], nid[index], txxt[index], cos_sim[i][index]]) # I want this to work.
return numba_list
print(similarity(idd, txt, cos_sim, 0.85))
在上面的代码中,在追加 List 期间,要么追加带有数字的列,要么追加 Text。我希望所有包含数字和文本的列都插入到 numba_list
.
我低于错误
1 frames
/usr/local/lib/python3.7/dist-packages/numba/core/dispatcher.py in error_rewrite(e, issue_type)
359 raise e
360 else:
--> 361 raise e.with_traceback(None)
362
363 argtypes = []
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Poison type used in arguments; got Poison<LiteralList((int64, [unichr x 12], int64, [unichr x 12], float32))>
During: resolving callee type: BoundFunction((<class 'numba.core.types.containers.ListType'>, 'append') for ListType[undefined])
During: typing of call at <ipython-input-179-6ee851edb6b1> (14)
File "<ipython-input-179-6ee851edb6b1>", line 14:
def zero(nid, txxt, cos_sim, threshold):
<source elided>
# print(i+1)
numba_list.append([nid[i], txxt[i], nid[index], txxt[index], cos_sim[i][index]])
^
您面临的问题来自输入问题:Numba 无法推断列表的类型。问题的根源是您正在处理包含不同项目类型的列表(据我所知,Numba 尚不支持该类型,并且无论如何都不会有效)。然而,元组就是为此而生的。这是一个未经测试的例子:
@numba.njit
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) & (i!=index):
numba_list.append((nid[i], nid[index], cos_sim[i][index]))
return numba_list
由于条件通常为真,您可以使用具有直接索引的预分配 Numpy 数组而不是慢速列表 append
调用来大大加快计算速度。但是,return 类型将与此解决方案不同。这个想法是 return 示例中的 3 个数组的元组,而不是每个包含 3 个项目的元组列表。此解决方案还受益于显着减少的内存。
我正在使用 Numba 来提高下面循环的速度。没有 Numba 执行需要 135 秒,使用 Numba 需要 0.30 秒 :) 这非常快。
在下面的循环中,我将数组与阈值 0.85 进行了比较。如果条件为真,我会将数据插入函数返回的列表中。
插入到列表中的数据如下所示。
['Source ID', 'Source TEXT', 'Similar ID', Similar TEXT, 'Score']
idd = df['ID'].to_numpy()
txt = df['TEXT'].to_numpy()
Column = 'TEXT'
df = preprocessing(dataresult, Column) # removing special characters of 'TEXT' column
message_embeddings = model_url(np.array(df['DescriptionNew'])) #passing df to universal sentence encoder model to create sentence embedding.
cos_sim = cosine_similarity(message_embeddings) #len(cos_sim) > 8000
# Below function finds duplicates amoung rows.
@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) & (i!=index):
numba_list.append([nid[i], nid[index], cos_sim[i][index]]) # either this works
# numba_list.append([txxt[i], txxt[index]]) # or either this works
# numba_list.append([nid[i], txxt[i], nid[index], txxt[index], cos_sim[i][index]]) # I want this to work.
return numba_list
print(similarity(idd, txt, cos_sim, 0.85))
在上面的代码中,在追加 List 期间,要么追加带有数字的列,要么追加 Text。我希望所有包含数字和文本的列都插入到 numba_list
.
我低于错误
1 frames
/usr/local/lib/python3.7/dist-packages/numba/core/dispatcher.py in error_rewrite(e, issue_type)
359 raise e
360 else:
--> 361 raise e.with_traceback(None)
362
363 argtypes = []
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Poison type used in arguments; got Poison<LiteralList((int64, [unichr x 12], int64, [unichr x 12], float32))>
During: resolving callee type: BoundFunction((<class 'numba.core.types.containers.ListType'>, 'append') for ListType[undefined])
During: typing of call at <ipython-input-179-6ee851edb6b1> (14)
File "<ipython-input-179-6ee851edb6b1>", line 14:
def zero(nid, txxt, cos_sim, threshold):
<source elided>
# print(i+1)
numba_list.append([nid[i], txxt[i], nid[index], txxt[index], cos_sim[i][index]])
^
您面临的问题来自输入问题:Numba 无法推断列表的类型。问题的根源是您正在处理包含不同项目类型的列表(据我所知,Numba 尚不支持该类型,并且无论如何都不会有效)。然而,元组就是为此而生的。这是一个未经测试的例子:
@numba.njit
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) & (i!=index):
numba_list.append((nid[i], nid[index], cos_sim[i][index]))
return numba_list
由于条件通常为真,您可以使用具有直接索引的预分配 Numpy 数组而不是慢速列表 append
调用来大大加快计算速度。但是,return 类型将与此解决方案不同。这个想法是 return 示例中的 3 个数组的元组,而不是每个包含 3 个项目的元组列表。此解决方案还受益于显着减少的内存。