np.zeros和np.zeros_like
np.zeros类似于C中的calloc,预定义后随着使用而动态分配内存
而np.zeros_like类似于C中的malloc+memset,在预定义时就直接初始化内存,之后直接使用内存,系统不再重新分配
以下测试结果取自https://stackoverflow.com/questions/27464039/why-the-performance-difference-between-numpy-zeros-and-numpy-zeros-like
This simple test with the memory_profile
package supports the claim that zeros
and empty
allocate memory 'on-the-fly', while zeros_like
allocates everything up front:
N = (1000, 1000)
M = (slice(None, 500, None), slice(500, None, None))
Line # Mem usage Increment Line Contents
================================================
2 17.699 MiB 0.000 MiB @profile
3 def test1(N, M):
4 17.699 MiB 0.000 MiB print(N, M)
5 17.699 MiB 0.000 MiB x = np.zeros(N) # no memory jump
6 17.699 MiB 0.000 MiB y = np.empty(N)
7 25.230 MiB 7.531 MiB z = np.zeros_like(x) # initial jump
8 29.098 MiB 3.867 MiB x[M] = 1 # jump on usage
9 32.965 MiB 3.867 MiB y[M] = 1
10 32.965 MiB 0.000 MiB z[M] = 1
11 32.965 MiB 0.000 MiB return x,y,z