[Tutor] Why is an instance smaller than the sum of its components?

Emile van Sebille emile at fenx.com
Tue Feb 3 22:59:27 CET 2015


On 2/3/2015 1:12 PM, Jugurtha Hadjar wrote:
> Hello,
>
> I was writing something and thought: Since the class had some
> 'constants', and multiple instances would be created, I assume that each
> instance would have its own data. So this would mean duplication of the
> same constants? If so, I thought why not put the constants in memory
> once, for every instance to access (to reduce memory usage).
>
> Correct me if I'm wrong in my assumptions (i.e: If instances share stuff).
>
> So I investigated further..
>
>  >>> import sys
>  >>> sys.getsizeof(5)
> 12
>
>
> So an integer on my machine is 12 bytes.
>
> Now:
>
>  >>> class foo(object):
> ...    def __init__(self):
> ...        pass
>
>  >>> sys.getsizeof(foo)
> 448
>
>  >>> sys.getsizeof(foo())
> 28
>
>  >>> foo
> <class '__main__.foo'>
>  >>> foo()
> <__main__.foo object at 0xXXXXXXX
>
>
> - Second weird thing:
>
>  >>> class bar(object):
> ...    def __init__(self):
> ...        self.w = 5
> ...        self.x = 6
> ...        self.y = 7
> ...        self.z = 8
>
>  >>> sys.getsizeof(bar)
> 448
>  >>> sys.getsizeof(foo)
> 448
>  >>> sys.getsizeof(bar())
> 28
>  >>> sys.getsizeof(foo())
> 28
>
>  >>> sys.getsizeof(bar().x)
> 12
>  >>> sys.getsizeof(bar().y)
> 12
>
>
> Summary questions:
>
> 1 - Why are foo's and bar's class sizes the same? (foo's just a nop)

i'm not sure on this one.

> 2 - Why are foo() and bar() the same size, even with bar()'s 4 integers?

neither foo() nor bar() return anything explicitly, so both return the 
default none


> 3 - Why's bar()'s size smaller than the sum of the sizes of 4 integers?

same as above.



More information about the Tutor mailing list