gpt4 book ai didi

python - nopython 模式下 Numba 递归函数出错

转载 作者:行者123 更新时间:2023-12-01 01:03:40 28 4
gpt4 key购买 nike

我想使用 nopython 模式在 Numba 中运行递归函数。到目前为止我只收到错误。这是一个非常简单的代码,用户给出一个少于五个元素的元组,然后该函数创建另一个元组,并向该元组添加一个新值(在本例中为数字 3)。重复此操作,直到最终元组的长度为 5。由于某种原因,这不起作用,不知道为什么。

@njit
def tup(a):
if len(a) == 5:
return a
else:
b = a + (3,)
b = tup(b)
return b

例如,如果a = (0,1),我希望最终结果是元组(0,1,3,3,3)

编辑:我正在使用 Numba 0.41.0,我收到的错误是内核即将死亡,“内核似乎已经死亡”。它将自动重新启动。'

最佳答案

您不应该这样做的原因有几个:

  • 这通常是一种在纯 Python 中可能比在 numba 修饰函数中更快的方法。
  • 迭代会更简单,也可能更快,但请注意,连接元组通常是一个 O(n) 操作,即使在 numba 中也是如此。因此该函数的整体性能将为O(n**2)。这可以通过使用支持 O(1) 附加的数据结构或支持预分配大小的数据结构来改进。或者只是不使用“循环”或“递归”方法。
  • 您是否尝试过如果省略 njit 装饰器并传入包含 6 个元素的元组会发生什么? (提示:它将达到递归限制,因为它永远不会满足递归的结束条件)。

Numba 在编写 0.43.1 时仅支持简单递归(当参数类型在递归之间不变时)。在您的情况下,类型确实发生了变化,您传入一个 tuple(int64 x 2) 但递归调用尝试传入一个 tuple(int64 x 3) 这是一个不同类型。奇怪的是,它在我的计算机上遇到了 StackOverflow - 这看起来像是 numba 中的一个错误。

我的建议是使用这个(没有numba,没有递归):

def tup(a):
if len(a) < 5:
a += (3, ) * (5 - len(a))
return a

这也返回预期的结果:

>>> tup((1,))
(1, 3, 3, 3, 3)
>>> tup((1, 2))
(1, 2, 3, 3, 3)

关于python - nopython 模式下 Numba 递归函数出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55577893/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com