Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getsizeof returns the same value for seemingly different lists

Tags:

python

memory

I have the following two dimensional bitmap:

num = 521
arr = [i == '1' for i in bin(num)[2:].zfill(n*n)]
board = [arr[n*i:n*i+n] for i in xrange(n)]

Just for curiosity I wanted to check how much more space will it take, if it will have integers instead of booleans. So I checked the current size with sys.getsizeof(board) and got 104

After that I modified

arr = [int(i) for i in bin(num)[2:].zfill(n*n)] , but still got 104

Then I decided to see how much will I get with just strings:

arr = [i for i in bin(num)[2:].zfill(n*n)], which still shows 104

This looks strange, because I expected list of lists of strings to waste way more memory than just booleans.

Apparently I am missing something about how the getsizeof calculates the size. Can anyone explain me why I get such results.

P.S. thanks to zehnpard's answer, I see that I can use sum(sys.getsizeof(i) for line in board for i in line) to approximately count the memory (most probably it will not count the lists, which is not that much important for me). Now I see the difference in numbers for string and int/bool (no difference for int and boolean)

like image 307
Salvador Dali Avatar asked Mar 04 '26 17:03

Salvador Dali


1 Answers

The docs for the sys module since Python 3.4 is pretty explicit:

Only the memory consumption directly attributed to the object is accounted for, not the memory consumption of objects it refers to.

Given that Python lists are effectively arrays of pointers to other Python objects, the number of elements a Python list contains will influence its size in memory (more pointers) but the type of objects contained will not (memory-wise, they aren't contained in the list, just pointed at).

To get the size of all items in a container, you need a recursive solution, and the docs helpfully provide a link to an activestate recipe. http://code.activestate.com/recipes/577504/

Given that this recipe is for Python 2.x, I'm sure this behavior was always standard, and got explicitly mentioned in the docs since 3.4 onwards.

like image 120
zehnpaard Avatar answered Mar 07 '26 05:03

zehnpaard



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!