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

时间:2018-04-16 20:02:08

标签: python numpy memory-management numba

我正在尝试使用循环来更新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时,我会看到如下错误:

  

对于释放的对象的校验和不正确 - 可能修改了对象   被释放后   ***在malloc_error_break中设置断点以进行调试

此错误并不总是发生在同一个地方。有时错误发生在第一个outerFunc完成后,但它可能会在第一个outerFunc完成之前显示。

是否与我正在进行内部更新,两次调用outerFunc或两者都有关?我在做内存管理吗?

1 个答案:

答案 0 :(得分:1)

您的代码适用于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?