Python 2.6可以用sys.getsizeof获取对象大小
2010 2 15 06:53 AM 3260次查看
顺便测了下各种类型的大小:
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可以看到,一个int占了12字节,一个str至少24字节,远远大于C语言的开销。
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
注意那些描述里包含at的,我估计这些只是指针的大小,不是全部的数据。
顺带一提,Google App Engine里的模型经过protobuf编码后,比pickling小了几乎一个数量级,所以传输速度会变快。
但是db.model_from_protobuf()的性能不如pickle.load(),所以get时的作用不是太明显。
0条评论 你不来一发么↓