hal*_*rlu 6 python arrays numpy function in-place
我正在尝试编写一个对数组执行数学运算的函数并返回结果.一个简化的例子可能是:
def original_func(A):
return A[1:] + A[:-1]
Run Code Online (Sandbox Code Playgroud)
为了加速并避免为每个函数调用分配新的输出数组,我想将输出数组作为参数,并在适当的位置更改它:
def inplace_func(A, out):
out[:] = A[1:] + A[:-1]
Run Code Online (Sandbox Code Playgroud)
但是,当以下列方式调用这两个函数时,
A = numpy.random.rand(1000,1000)
out = numpy.empty((999,1000))
C = original_func(A)
inplace_func(A, out)
Run Code Online (Sandbox Code Playgroud)
原始函数似乎是就地函数的两倍.怎么解释这个?就地功能不应该更快,因为它不必分配内存吗?
pv.*_*pv. 12
如果要在现场执行操作,请执行此操作
def inplace_func(A, out):
np.add(A[1:], A[:-1], out)
这不会产生任何临时性的A[1:] + A[:-1].
所有Numpy二进制操作都有相应的函数,请在此处查看列表:http://docs.scipy.org/doc/numpy/reference/ufuncs.html#available-ufuncs
我认为答案如下:
在这两种情况下,您都可以计算A[1:] + A[:-1],在这两种情况下,您实际上都会创建一个中间矩阵.
但是,在第二种情况下,您会将整个新分配的大数组显式复制到保留的内存中.复制此类数组所需的时间与原始操作大致相同,因此实际上您将时间翻倍.
总而言之,在第一种情况下,您可以:
compute A[1:] + A[:-1] (~10ms)
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,你这样做
compute A[1:] + A[:-1] (~10ms)
copy the result into out (~10ms)
Run Code Online (Sandbox Code Playgroud)