有人能解释一下在下面的例子中,当使用dictionary
和objects
操作时,内存在幕后发生了什么吗
In [52]: class O(object):
....: var1 = 'asdfasdfasfasdfasdfasdfasdf'
....: var2 = 255
....:
In [53]: dt = {'var1': 'asdfasdfasfasdfasdfasdfasdf', 'var2': 255}
In [55]: o = O()
In [57]: sys.getsizeof(o)
Out[57]: 64
In [58]: sys.getsizeof(dt)
Out[58]: 280
根据上述数值,接下来的事情很奇怪
In [68]: sys.getsizeof(o.var1)
Out[68]: 64
In [69]: sys.getsizeof(o.var2)
Out[69]: 24
In [70]: sys.getsizeof(dt['var1'])
Out[70]: 64
In [71]: sys.getsizeof(dt['var2'])
Out[71]: 24
数据结构中的值大小相同,但类型之间的差异让我想知道在幕后会发生什么?你知道吗
这个例子是否使objects
比dictionaries
更有效?你知道吗
我使用的是ubuntu14.04和python2.7.6
注意,^{} 给出了对象本身的大小,但这并不是全部。一个对象具有各种属性,这些属性也会影响整个内存占用。例如,一个类的实例有一个
__dict__
,它保存其属性的值:注意三件有趣的事:
o.__dict__
中没有任何内容,因为var1
和var2
是类属性,存储在O
,而不是实例属性;并且o.__dict__
中没有任何内容,但它的大小仍然与dt
相同,因为字典的初始化空间足以容纳(IIRC)8个键,以避免在向字典添加项时频繁调整大小(有关字典实现的更多信息,请参阅"The Mighty Dictionary")。你知道吗另请注意,如果我们比较两种情况下的实例和类的大小(这是一个更公平的比较),差距就会缩小:
一点也不;首先,如我所示,对象通常是使用字典来实现的(有一种方法可以通过在类上定义
__slots__
预定义属性来避免为每个实例创建__dict__
,但我在这里就不谈了),字典本身就是对象(尽管内置类型略有不同,原因我就不多说了)!你知道吗一般来说,除非出现问题,否则不要担心内存细节—如果需要state和行为(attributes和方法),请定义一个类;如果只需要state,请使用字典。你知道吗
两个对象的简单比较表明dictionary远比简单类复杂:
反对:
相关问题 更多 >
编程相关推荐