函数和numpy数组预分配

时间:2013-03-03 01:04:05

标签: 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)

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

我的第一个想法如下,但当然,它带来了成本,我现在必须更改所有功能签名。

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) 

1 个答案:

答案 0 :(得分:2)

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

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对象;如果未提供out,则会返回新对象。在这种情况下,即使修改现有值,它仍然会返回值,但如果提供了explo; icit {{1}},您可以轻松修改它以返回None。

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