【问题标题】:Why does numpy.zeros takes up little space为什么 numpy.zeros 占用空间很小
【发布时间】:2015-02-18 21:51:41
【问题描述】:

我想知道为什么 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

内存使用率上升。有没有办法改变一个值,然后把它改回 numpy.zeros 最初在 python 或 cython 中的格式?

【问题讨论】:

  • 您如何测量每个阵列使用的内存?如果x = numpy.zeros(200000000) 那么x.nbytes 在我的机器上就是1600000000。对于x = numpy.repeat(0, 200000000),使用了一半内存(创建数组时使用int32 数据类型而不是float64 数据类型)。
  • 我只是在观察活动监视器的变化
  • 仅供参考:我想我只是在 windows 2012 服务器上遇到了同样的事情,使用 python 3.7.2 和一些最近的 numpy 版本。有趣的问题是:x[0:10]=1 的情况会发生什么。是分配整个数组还是只分配所需的切片?明天检查:-)

标签: python arrays numpy cython


【解决方案1】:

您使用的是 Linux 吗? Linux 有惰性内存分配。 numpy 中对malloccalloc 的底层调用总是“成功”。在第一次访问内存之前,实际上没有分配内存。

zeros 函数将使用calloc 在首次访问之前将所有已分配的内存清零。因此,numpy 不需要显式地将数组归零,因此数组将被延迟初始化。而repeat 函数不能依赖calloc 来初始化数组。相反,它必须使用malloc,然后将重复的复制到数组中的所有元素(从而强制立即分配)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2013-01-01
    • 2016-12-26
    • 2015-02-12
    • 2019-12-14
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多