Python 2.6可以用sys.getsizeof获取对象大小

标签:Python

刚在GAE的Python论坛看到有人使用sys.getsizeof函数获取对象的字节数。之前一直没用过这玩意,查了文档才发现是2.6新增的。

顺便测了下各种类型的大小:
import sys

class A1:
  pass

class A2(object):
  pass

class B1(A1):
  pass

class B2(A2):
  pass

class C1:
  def __init__(self, x):
    self.x = x

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

class D1:
  x = 1

class D2(object):
  x = 1

def f1():
  pass

def f2(x):
  pass

def f3(x=None):
  pass

def f4(x):
  x += 1
  return x

for obj in [0, 2 ** 30, 2 ** 31, 2 ** 44, 2 ** 45, 0.0, None, True, '', '1', '11', u'', u'1', u'11', (), (1,), (1, 1), [], [1], [1, 1], {}, {0: 0}, dict(zip(range(5), range(5))), dict(zip(range(6), range(6))), object, A1(), A2(), B1(), B2(), C1(1), C2(1), D1(), D2(), A1, A2, B1, B2, C1, C2, D1, D2, f1, f2, f3, f4, lambda x: x]:
  print `obj`, ':', sys.getsizeof(obj)
结果:
0 : 12
1073741824 : 12
2147483648L : 20
17592186044416L : 20
35184372088832L : 22
0.0 : 16
None : 8
True : 12
'' : 24
'1' : 25
'11' : 26
u'' : 26
u'1' : 28
u'11' : 30
() : 28
(1,) : 32
(1, 1) : 36
[] : 36
[1] : 40
[1, 1] : 44
{} : 140
{0: 0} : 140
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4} : 140
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5} : 524
<type 'object'> : 436
<__main__.A1 instance at 0x00C96EB8> : 36
<__main__.A2 object at 0x00C93D70> : 32
<__main__.B1 instance at 0x00C96EE0> : 36
<__main__.B2 object at 0x00C93D90> : 32
<__main__.C1 instance at 0x00C96F08> : 36
<__main__.C2 object at 0x00C93DB0> : 32
<__main__.D1 instance at 0x00C96F30> : 36
<__main__.D2 object at 0x00C93DD0> : 32
<class __main__.A1 at 0x00BB2AB0> : 48
<class '__main__.A2'> : 452
<class __main__.B1 at 0x00C8CD80> : 48
<class '__main__.B2'> : 452
<class __main__.C1 at 0x00C99030> : 48
<class '__main__.C2'> : 452
<class __main__.D1 at 0x00C99090> : 48
<class '__main__.D2'> : 452
<function f1 at 0x00C952F0> : 60
<function f2 at 0x00C95130> : 60
<function f3 at 0x00C95170> : 60
<function f4 at 0x00C951B0> : 60
<function <lambda> at 0x00C951F0> : 60
可以看到,一个int占了12字节,一个str至少24字节,远远大于C语言的开销。
注意那些描述里包含at的,我估计这些只是指针的大小,不是全部的数据。

顺带一提,Google App Engine里的模型经过protobuf编码后,比pickling小了几乎一个数量级,所以传输速度会变快。
但是db.model_from_protobuf()的性能不如pickle.load(),所以get时的作用不是太明显。

0条评论 你不来一发么↓

    想说点什么呢?