【问题标题】:define Array without allocating it定义数组而不分配它
【发布时间】:2021-11-14 08:23:59
【问题描述】:

我看到 Numba 不支持字典列表...因此,我决定改用 2D Numpy 数组。这很可悲:(

我遇到的第二个问题是我想按需创建这个数组。这是一个例子:

@nb.njit(parallel=True)
def blah(cond=True):
    ary = None
    if cond : ary = np.zeros((10000,2))

    for i in range(5):
        if cond: ary[i] = np.array([i,i])

    return 555, ary

问题是ary不能是None,所以即使不使用也要分配数组。

有没有办法在不分配 ary 的情况下定义它,这样 Numba 就不会抱怨了?

“并行”似乎导致了问题??


这也很有趣,它只更新第一行(i 递增):

ary[i,:] = np.array([a,b])

但是这行得通

 ary[i] = np.array([a,b])

【问题讨论】:

  • 我无法在我的机器上重现该问题。 Numba 0.53 与None 值一起工作得非常好(代码只是不构建,因为abccond 没有定义,但除此之外它很好)。您是否测试了最新版本?
  • 0.48 ..but 0.53 too : Dimension mismatch
  • 如果您遇到问题,这不是minimal reproducible example
  • 更新了Q...并行

标签: python numpy allocation numba


【解决方案1】:

如果您希望代码被并行化,那么是的,它绝对必须首先分配。不能有多个线程尝试独立调整数组的大小。

【讨论】:

  • 我怀疑,并行 10 对 3 毫秒更好;)
【解决方案2】:

您可以考虑分配一个大小为零的数组而不是 None。无论条件是真还是假,这都会使类型相同。

@nb.njit(parallel=True)
def blah(cond=True):
    
    if cond:
        ary = np.zeros((10000,2))
    else:
        ary = np.zeros((0,0))

    for i in range(5):
        if cond:
            ary[i ,:] = (i, i)

    return ary

blah(cond=False)

如果可以的话,避免在循环的每次迭代 (np.array([i, i])) 中初始化一个新数组也会快得多。

在循环中显式使用 Numba 的 prange 可能会有所帮助,但通常只有在循环内进行更密集的计算时才会变得重要。这个例子太简单了,并行化的开销并不值得。

for i in nb.prange(10000):
    if cond:
        ary[i, 0] = i
        ary[i, 1] = i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2014-05-13
    • 2016-11-08
    • 2012-03-09
    • 2020-12-05
    • 2016-12-25
    相关资源
    最近更新 更多