Python Class 内存使用
Python Class Memory Usage
我想了解 python 的 classes 是如何实现的,以及分配给它们会消耗多少内存。所以我创建了一个大的 numpy 数组,然后将其分配给一个 class,然后将那个 class 分配给另一个 class(如下)。
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 数组的 class 没有 nbytes 作为方法。
如果我对 x
进行更改,则 a.x
和 b.x.x
会自动更新以反映它。 Python documentation 注意对象别名就像指针。 a.x
和 b.x.x
更像是指向原始 x
的指针,我说得对吗?作为指针,a
和 b
的内存占用因此不应与 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 的 classes 是如何实现的,以及分配给它们会消耗多少内存。所以我创建了一个大的 numpy 数组,然后将其分配给一个 class,然后将那个 class 分配给另一个 class(如下)。
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 数组的 class 没有 nbytes 作为方法。
如果我对 x
进行更改,则 a.x
和 b.x.x
会自动更新以反映它。 Python documentation 注意对象别名就像指针。 a.x
和 b.x.x
更像是指向原始 x
的指针,我说得对吗?作为指针,a
和 b
的内存占用因此不应与 x
的基础大小相关。这是正确的吗?
将这些对象分配给 numpy
将为您提供仅代表指针大小的对象引用,因此它们与对象的实际大小无关。
至于 sys.getsizeof()
,它会为您提供 numpy 对象描述的大小,但不是所有子对象的大小,因此在这种情况下肯定是不准确的。我的猜测是这种情况下的实际大小为 sys.getsizeof(x) + x.nbytes
.
至于a
存储x
,是的,默认情况下Python只复制引用,而不是实际值。
为了说明这种行为:
x = []
y = x
x.append('SPAM')
print y
# Returns: ['SPAM']
一个很好的分析内存使用的模块是pympler