Python 函数和numpy数组预分配

Python 函数和numpy数组预分配,python,performance,function,numpy,Python,Performance,Function,Numpy,如何优化涉及numpy阵列的函数 用例: def create_array_and_fill(a, b, N): res = np.zeros(N, N) res[0] = a res[-1] = b return res c = create_array_and_fill(5, 9, 100) 但是,有时,我会事先知道我需要使用的所有阵列的最大大小(比如用于测试目的),那么最好的方法是什么呢?我应该预先分配吗?最好的方法是什么?例如,我是否可以将预分配的

如何优化涉及numpy阵列的函数

用例:

def create_array_and_fill(a, b, N):
    res = np.zeros(N, N)

    res[0] = a
    res[-1] = b

    return res

c = create_array_and_fill(5, 9, 100)
但是,有时,我会事先知道我需要使用的所有阵列的最大大小(比如用于测试目的),那么最好的方法是什么呢?我应该预先分配吗?最好的方法是什么?例如,我是否可以将预分配的数组传递给函数,以便函数只更新它而不是返回新数组

我的第一个想法如下,但是,当然,这是有代价的,我现在必须改变我所有的函数签名

def create_array_and_fill(a, b, N, res):

    res[0] = a
    res[-1] = b

    # No more return here?

c = np.zeros(N, N)
create_array_and_fill(a, b, N, c) 

如果我理解你的要求,你可以这样做:

def fill_array(a, b, N, out=None):
    if out is None:
        out = np.zeros(N, N)
    out[0] = a
    out[-1] = b
    return out
如果提供了
out
对象,则修改该对象;如果未提供
out
对象,则返回一个新对象。在这种情况下,即使修改现有的值,它仍然返回该值,但是如果expl;已提供icit
out


但是,如果希望函数以任何方式工作(使用给定的“out”数组或创建新数组),则必须更改函数。如果您在创建新数组的函数中编写代码,那么没有神奇的方法可以让它不执行该代码,因为您已经预先创建了另一个数组。您必须编辑函数。

这取决于函数。如果函数设置为允许传递预分配数组,则可以将预分配数组传递给该函数。你需要更具体才能得到更具体的答案。如果需要,我可以更改函数签名,但我该怎么做呢?