我想知道为什么numpy.zeros会占用这么小的空间?
x = numpy.zeros(200000000)
这不占用任何记忆,
x = numpy.repeat(0,200000000)
占用大约1.5GB。 numpy.zeros会创建一个空指针数组吗? 如果是这样,有没有办法在cython中更改它后将指针设置为空?如果我使用:
x = numpy.zeros(200000000)
x[0:200000000] = 0.0
内存使用率上升。有没有办法改变一个值,然后将其改回原来在python或cython中使用的格式numpy.zeros?
答案 0 :(得分:19)
您使用的是Linux吗? Linux有懒惰的内存分配。 numpy中对malloc
和calloc
的基本调用始终“成功”。在首次访问内存之前,实际上没有分配内存。
zeros
函数将使用calloc
,它在首次访问之前将任何已分配的内存归零。因此,numpy不需要明确地将数组归零,因此数组将被懒惰地初始化。然而,repeat
函数不能依赖calloc
初始化数组。相反,它必须使用malloc
,然后将重复复制到数组中的所有元素(从而强制立即分配)。