Python 类内存使用情况

标签 python memory-management numpy

我试图了解Python的类是如何实现的以及分配给它们会消耗多少内存。所以我创建了一个大的 numpy 数组,然后将其分配给一个类,然后将该类分配给另一个类(如下)。

import numpy as np

class Foo(object):
    def __init__(self, x=0):
        self.x = x

class Bar(object):
    def __init__(self, x=None):
        self.x = x

x = np.random.normal(0, 1, (50000, 10))
a = Foo(x)
b = Bar(a)

使用 sys.getsizeof 似乎无助于获取 numpy 数组的内存大小。 Numpy 数组使用 nbytes,但引用 numpy 数组的类没有 nbytes 作为方法。

如果我对 x 进行更改,则 a.xb.x.x 会自动更新以反射(reflect)它。 python documentation注意对象别名就像指针。我认为 a.xb.x.x 可以被认为更像是指向原始 x 的指针,对吗?与指针类似,ab 的内存占用不应与 x 的底层大小相关。这是正确的吗?

最佳答案

将这些对象分配给numpy将为您提供仅代表指针大小的对象引用,因此它们与对象的实际大小无关。

至于sys.getsizeof(),这将为您提供 numpy 对象描述的大小,但不是所有子对象的大小,因此对于这种情况来说它肯定是不准确的。我的猜测是,这种情况下的实际大小将是 sys.getsizeof(x) + x.nbytes

至于a存储x,是的,默认情况下Python只复制引用,而不复制实际值。

为了说明这种行为:

x = []
y = x
x.append('SPAM')
print y
# Returns: ['SPAM']

一个很好的分析内存使用情况的模块是 pympler

关于Python 类内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117929/

相关文章:

python - 使用加权多点定位寻找未知点

algorithm - 大数据大小的缓存抖动效应降低

C 内存分配 : Fixed-length array in a struct in a struct

python - 如何将 OpenNI VideoFrame 转换为 OpenCV Mat 数据结构?

python - 使用 PIL 和 OpenCV 2 在 Python 中轴越界错误

python - 类型错误 : Unicode-objects must be encoded before hashing What is wrong?

python - 我们可以在 GAE 中运行多处理池吗?

python - 将curl请求转换为python请求

c# - 为什么对值类型数组求和比对引用类型数组求和慢?

python - 将一维 numpy 数组转换为列表列表