【问题标题】:TypingError: Failed in nopython mode pipeline (step: nopython frontend) in numbaTypingError:numba 中的 nopython 模式管道失败(步骤:nopython 前端)
【发布时间】:2023-02-01 01:45:43
【问题描述】:

我正在尝试编写我的第一个并行化函数

但问题是,我收到以下错误:

possible_EVENTS = np.array([""])
@njit(parallel=True,nopython=True)
def add_History(events,EVENTS):
    index=events.where(events=="Repair")
    add=np.array("")
    pre_events=events[index:]
    if ("LOMT" in pre_events) & ("DIMT" in pre_events):
        for i in pre_events:
            if "FU" not in i:
                add.append(i)
            else:
                break
    if len(add)>=5:
        possible_EVENTS .append(add)

for i in tqdm(packages):
    events=np.array(df_["Event"].loc[df_["Packages"]==i].values)
    add_History(events,possible_EVENTS )

但我得到这个错误。

TypingError                               Traceback (most recent call last)
C:\Users\local_PIETAPA\Temp\ipykernel_16492\3239905456.py in <module>
     16 for container in tqdm(container_search):
     17     events=np.array(df_["EVENT_CODE"].loc[df_["UNIT"]==container].values)
---> 18     add_EPOS_History(events,EPOS_EVENTS)

C:\ProgramData\Anaconda3\lib\site-packages\numba\core\dispatcher.py in _compile_for_args(self, *args, **kws)
    466                 e.patch_message(msg)
    467 
--> 468             error_rewrite(e, 'typing')
    469         except errors.UnsupportedError as e:
    470             # Something unsupported is present in the user code, add help info

C:\ProgramData\Anaconda3\lib\site-packages\numba\core\dispatcher.py in error_rewrite(e, issue_type)
    407                 raise e
    408             else:
--> 409                 raise e.with_traceback(None)
    410 
    411         argtypes = []

TypingError: Failed in nopython mode pipeline (step: nopython frontend)
non-precise type array(pyobject, 1d, C)
During: typing of argument at C:\Users\local_PIETAPA\Temp\ipykernel_16492\3239905456.py (4)

File "..\..\..\local_PIETAPA\Temp\ipykernel_16492\3239905456.py", line 4:
<source missing, REPL/exec in use?>

而且我不知道如何解决它。你能帮助我吗?

【问题讨论】:

    标签: python parallel-processing numba


    【解决方案1】:

    Numba 抱怨是因为你正在提供它动态 Python 对象哪个是Numba 不支持(并且不能得到任何类似工具的有效支持)。这当然是因为events 是对象数组而不是字符串数组。你需要确保输入数据类型是字符串类型,不反对。

    代码中还有许多其他问题:

    • 请注意,Numba 尚未有效支持字符串。

    • 另请注意,parallel=True 不会自动并行化您的函数。您需要为此使用 prange 并检查它是否可以工作(即它不会引入竞争条件等错误)。问题是你不能在这里轻易使用prange因为append所以parallel=True目前没用。

    • 在这里使用 add.append(i) 是个坏主意,因为 add 是一个 Numpy 数组。这样做会导致执行时间是二次的而不是线性的,因为每次调用函数时都会创建新数组。这是一个常见问题。解决方案是将项目附加到列表,然后将列表转换为 Numpy 数组。

    • 假定全局数组是常量。您不应该修改它们(无论如何这在软件工程中都是非常糟糕的)。解决方案是将数组提供给函数并返回给你。实际上,append 创建了一个新数组,它不会修改当前数组。我强烈建议你小心阅读np.array的文档。到底,即使没有 Numba,您当前的函数也不会计算任何内容!请在尝试使其更快之前检查您的代码.

    • events.where(events=="Repair") 遍历整个 events 数组,这比遍历数组并在找到项目位置时中断效率低。

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 2019-07-30
      • 2021-08-21
      • 2020-07-21
      • 2019-08-21
      • 2017-08-08
      • 2020-06-15
      • 2017-05-24
      • 1970-01-01
      相关资源
      最近更新 更多