Python & Numba:释放对象的校验和不正确

Python & Numba: incorrect checksum for freed object

我正在尝试使用循环更新 Numba 中的数组,因为我知道 Numba 不支持创建数组。简而言之,我的函数如下所示:

@jit(nopython=True)
def innerFunc(arr):
    for i in range(10000):
        arr[i] = arr[i] * 100
    return arr

def outerFunc(arr):
    arr = innerFunc(arr)
    return arr

def main():
    ####Create two numpy arrays with 10,000 random numbers each####
    ####and call them arr1 and arr2####
    outerFunc(arr1)
    outerFunc(arr2)
    return arr1, arr2

但是,当我 运行 main 时,我一直看到这样的错误:

incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug

而且这个错误并不总是发生在同一个地方。有时错误发生在第一个 outerFunc 完成后,但它甚至可能在第一个 outerFunc 完成之前出现。

这是否与我正在进行就地更新、调用 outerFunc 两次或两者都有关系?我在做内存管理方面的事情吗?

您的代码适用于 Numba 0.37(并且可能适用于更早的许多版本):

import numba as nb
import numpy as np

@nb.jit(nopython=True)
def innerFunc(arr):
    for i in range(10000):
        arr[i] = arr[i] * 100
    return arr

def outerFunc(arr):
    arr = innerFunc(arr)
    return arr

def main():
    arr1 = np.random.normal(size=(10000,))
    arr2 = np.random.normal(size=(10000,))
    outerFunc(arr1)
    outerFunc(arr2)
    return arr1, arr2

但你也可以这样做:

@nb.jit(nopython=True)
def func2(x):
    for i in range(x.shape[0]):
        x[i] = x[i] * 100
    return x

@nb.jit(nopython=True)
def func(N):
    arr1 = np.random.randn(N)
    arr2 = np.random.randn(N)

    arr1 = func2(arr1)
    arr2 = func2(arr2)

    return arr1, arr2

和 运行 func(10000) 也可以。

您使用的是哪个版本的 Numba?