How to manually calculate a size of a dictionary (number of bytes it occupies in memory). I read that initially it is 280 bytes, at 6th key it increases and then at 86th so on. I want to calculate the size it will occupy when I have more than 10000 keys.

4 Answers

sys.getsizeof will help in that case:

from sys import getsizeof dct = {'a': 5, 'b': 7} print(getsizeof(dct)) 

especially for dictionaries the size will depend on your python version (the implementation has changed recently).

a quick way to create an N-sized dictionary is:

from itertools import zip_longest dct = dict(zip_longest(range(N), (), fillvalue=None)) # {0: None, 1: None, 2: None, ....} 

this should help test your assumptions for your specific python version.

this question may be related.

the sys.getsizeof not work with nested dict, as shown in the example bellow.

>>> import sys >>> d = { "onj1": {"name":"object 01", "id": "123"},"onj2": {"name":"object 02", "id": "124"}} >>> d0 = {} >>> sys.getsizeof(d0) 240 >>> sys.getsizeof(d) 240 

So the solution found was the function provided by this site:post OR github

follow the function:

import sys def get_size(obj, seen=None): """Recursively finds size of objects""" size = sys.getsizeof(obj) if seen is None: seen = set() obj_id = id(obj) if obj_id in seen: return 0 # Important mark as seen *before* entering recursion to gracefully handle # self-referential objects seen.add(obj_id) if isinstance(obj, dict): size += sum([get_size(v, seen) for v in obj.values()]) size += sum([get_size(k, seen) for k in obj.keys()]) elif hasattr(obj, '__dict__'): size += get_size(obj.__dict__, seen) elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)): size += sum([get_size(i, seen) for i in obj]) return size 

You can do a quick check with sys.getsizeof() (it will return the size of an object in bytes):

>>> import sys, itertools >>> sys.getsizeof(dict(zip(range(1), itertools.cycle([1])))) 280 >>> sys.getsizeof(dict(zip(range(5), itertools.cycle([1])))) 280 >>> sys.getsizeof(dict(zip(range(6), itertools.cycle([1])))) 1048 >>> sys.getsizeof(dict(zip(range(85), itertools.cycle([1])))) 3352 >>> sys.getsizeof(dict(zip(range(86), itertools.cycle([1])))) 12568 >>> sys.getsizeof(dict(zip(range(87), itertools.cycle([1])))) 12568 >>> sys.getsizeof(dict(zip(range(10000), itertools.cycle([1])))) 786712 

If you are interested in actual inner-workings of Python dictionaries, the dictobject.c is the definitive resource (here for the latest Python 3.6 branch). Also, take a look at dictnotes.txt.

Use sys.getsizeof to get the size info

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy