Skip to content

Instantly share code, notes, and snippets.

@cr0hn
Created April 22, 2020 08:53
Show Gist options
  • Save cr0hn/2fcc6d0ea1dec1a1a8aae8366bee3de2 to your computer and use it in GitHub Desktop.
Save cr0hn/2fcc6d0ea1dec1a1a8aae8366bee3de2 to your computer and use it in GitHub Desktop.
Analysis of resulting size for different Python data types: dict, classes, classes with __slots__, namedtuples and dataclasses
Number of elements: 10
-----------------------
Dict: 360 bytes # 636 bytes
Namedtuple: 120 bytes # 396 bytes
Class: 48 bytes # 1202 bytes
Class Slots: 48 bytes # 556 bytes
Dataclass: 48 bytes # 468 bytes
Number of elements: 100
------------------------
Dict: 4696 bytes # 7492 bytes
Namedtuple: 840 bytes # 3636 bytes
Class: 48 bytes # 13586 bytes
Class Slots: 48 bytes # 7540 bytes
Dataclass: 48 bytes # 4268 bytes
Number of elements: 1000
-------------------------
Dict: 36960 bytes # 64956 bytes
Namedtuple: 8040 bytes # 36036 bytes
Class: 48 bytes # 125950 bytes
Class Slots: 48 bytes # 65004 bytes
Dataclass: 48 bytes # 39028 bytes
"""
Analysis of resulting size for different Python data types. It was analyzed:
- dict
- classes
- classes with __slots__
- dataclases
- Namedtuples
Author: Daniel García (cr0hn)
Last update: 2020/22/04
Python version: 3.8
"""
import sys
from gc import get_referents
from dataclasses import dataclass
from collections import namedtuple
from types import ModuleType, FunctionType
#
# This function was got from: https://stackoverflow.com/q/58675479/8153205
#
# Custom objects know their class.
# Function objects seem to know way too much, including modules.
# Exclude modules as well.
BLACKLIST = type, ModuleType, FunctionType
def getsize(obj):
"""sum size of object & members."""
if isinstance(obj, BLACKLIST):
raise TypeError(
'getsize() does not take argument of type: ' + str(type(obj)))
seen_ids = set()
size = 0
objects = [obj]
while objects:
need_referents = []
for obj in objects:
if not isinstance(obj, BLACKLIST) and id(obj) not in seen_ids:
seen_ids.add(id(obj))
size += sys.getsizeof(obj)
need_referents.append(obj)
objects = get_referents(*need_referents)
return size
# -------------------------------------------------------------------------
# Small
# -------------------------------------------------------------------------
class Klass:
def __init__(self, **kwargs):
for x, y in kwargs.items():
setattr(self, x, y)
@dataclass
class DataKlass10:
v0: str
v1: str
v2: str
v3: str
v4: str
v5: str
v6: str
v7: str
v8: str
v9: str
@dataclass
class DataKlass100:
v0: str
v1: str
v2: str
v3: str
v4: str
v5: str
v6: str
v7: str
v8: str
v9: str
v10: str
v11: str
v12: str
v13: str
v14: str
v15: str
v16: str
v17: str
v18: str
v19: str
v20: str
v21: str
v22: str
v23: str
v24: str
v25: str
v26: str
v27: str
v28: str
v29: str
v30: str
v31: str
v32: str
v33: str
v34: str
v35: str
v36: str
v37: str
v38: str
v39: str
v40: str
v41: str
v42: str
v43: str
v44: str
v45: str
v46: str
v47: str
v48: str
v49: str
v50: str
v51: str
v52: str
v53: str
v54: str
v55: str
v56: str
v57: str
v58: str
v59: str
v60: str
v61: str
v62: str
v63: str
v64: str
v65: str
v66: str
v67: str
v68: str
v69: str
v70: str
v71: str
v72: str
v73: str
v74: str
v75: str
v76: str
v77: str
v78: str
v79: str
v80: str
v81: str
v82: str
v83: str
v84: str
v85: str
v86: str
v87: str
v88: str
v89: str
v90: str
v91: str
v92: str
v93: str
v94: str
v95: str
v96: str
v97: str
v98: str
v99: str
@dataclass
class DataKlass1000:
v0: str
v1: str
v2: str
v3: str
v4: str
v5: str
v6: str
v7: str
v8: str
v9: str
v10: str
v11: str
v12: str
v13: str
v14: str
v15: str
v16: str
v17: str
v18: str
v19: str
v20: str
v21: str
v22: str
v23: str
v24: str
v25: str
v26: str
v27: str
v28: str
v29: str
v30: str
v31: str
v32: str
v33: str
v34: str
v35: str
v36: str
v37: str
v38: str
v39: str
v40: str
v41: str
v42: str
v43: str
v44: str
v45: str
v46: str
v47: str
v48: str
v49: str
v50: str
v51: str
v52: str
v53: str
v54: str
v55: str
v56: str
v57: str
v58: str
v59: str
v60: str
v61: str
v62: str
v63: str
v64: str
v65: str
v66: str
v67: str
v68: str
v69: str
v70: str
v71: str
v72: str
v73: str
v74: str
v75: str
v76: str
v77: str
v78: str
v79: str
v80: str
v81: str
v82: str
v83: str
v84: str
v85: str
v86: str
v87: str
v88: str
v89: str
v90: str
v91: str
v92: str
v93: str
v94: str
v95: str
v96: str
v97: str
v98: str
v99: str
v100: str
v101: str
v102: str
v103: str
v104: str
v105: str
v106: str
v107: str
v108: str
v109: str
v110: str
v111: str
v112: str
v113: str
v114: str
v115: str
v116: str
v117: str
v118: str
v119: str
v120: str
v121: str
v122: str
v123: str
v124: str
v125: str
v126: str
v127: str
v128: str
v129: str
v130: str
v131: str
v132: str
v133: str
v134: str
v135: str
v136: str
v137: str
v138: str
v139: str
v140: str
v141: str
v142: str
v143: str
v144: str
v145: str
v146: str
v147: str
v148: str
v149: str
v150: str
v151: str
v152: str
v153: str
v154: str
v155: str
v156: str
v157: str
v158: str
v159: str
v160: str
v161: str
v162: str
v163: str
v164: str
v165: str
v166: str
v167: str
v168: str
v169: str
v170: str
v171: str
v172: str
v173: str
v174: str
v175: str
v176: str
v177: str
v178: str
v179: str
v180: str
v181: str
v182: str
v183: str
v184: str
v185: str
v186: str
v187: str
v188: str
v189: str
v190: str
v191: str
v192: str
v193: str
v194: str
v195: str
v196: str
v197: str
v198: str
v199: str
v200: str
v201: str
v202: str
v203: str
v204: str
v205: str
v206: str
v207: str
v208: str
v209: str
v210: str
v211: str
v212: str
v213: str
v214: str
v215: str
v216: str
v217: str
v218: str
v219: str
v220: str
v221: str
v222: str
v223: str
v224: str
v225: str
v226: str
v227: str
v228: str
v229: str
v230: str
v231: str
v232: str
v233: str
v234: str
v235: str
v236: str
v237: str
v238: str
v239: str
v240: str
v241: str
v242: str
v243: str
v244: str
v245: str
v246: str
v247: str
v248: str
v249: str
v250: str
v251: str
v252: str
v253: str
v254: str
v255: str
v256: str
v257: str
v258: str
v259: str
v260: str
v261: str
v262: str
v263: str
v264: str
v265: str
v266: str
v267: str
v268: str
v269: str
v270: str
v271: str
v272: str
v273: str
v274: str
v275: str
v276: str
v277: str
v278: str
v279: str
v280: str
v281: str
v282: str
v283: str
v284: str
v285: str
v286: str
v287: str
v288: str
v289: str
v290: str
v291: str
v292: str
v293: str
v294: str
v295: str
v296: str
v297: str
v298: str
v299: str
v300: str
v301: str
v302: str
v303: str
v304: str
v305: str
v306: str
v307: str
v308: str
v309: str
v310: str
v311: str
v312: str
v313: str
v314: str
v315: str
v316: str
v317: str
v318: str
v319: str
v320: str
v321: str
v322: str
v323: str
v324: str
v325: str
v326: str
v327: str
v328: str
v329: str
v330: str
v331: str
v332: str
v333: str
v334: str
v335: str
v336: str
v337: str
v338: str
v339: str
v340: str
v341: str
v342: str
v343: str
v344: str
v345: str
v346: str
v347: str
v348: str
v349: str
v350: str
v351: str
v352: str
v353: str
v354: str
v355: str
v356: str
v357: str
v358: str
v359: str
v360: str
v361: str
v362: str
v363: str
v364: str
v365: str
v366: str
v367: str
v368: str
v369: str
v370: str
v371: str
v372: str
v373: str
v374: str
v375: str
v376: str
v377: str
v378: str
v379: str
v380: str
v381: str
v382: str
v383: str
v384: str
v385: str
v386: str
v387: str
v388: str
v389: str
v390: str
v391: str
v392: str
v393: str
v394: str
v395: str
v396: str
v397: str
v398: str
v399: str
v400: str
v401: str
v402: str
v403: str
v404: str
v405: str
v406: str
v407: str
v408: str
v409: str
v410: str
v411: str
v412: str
v413: str
v414: str
v415: str
v416: str
v417: str
v418: str
v419: str
v420: str
v421: str
v422: str
v423: str
v424: str
v425: str
v426: str
v427: str
v428: str
v429: str
v430: str
v431: str
v432: str
v433: str
v434: str
v435: str
v436: str
v437: str
v438: str
v439: str
v440: str
v441: str
v442: str
v443: str
v444: str
v445: str
v446: str
v447: str
v448: str
v449: str
v450: str
v451: str
v452: str
v453: str
v454: str
v455: str
v456: str
v457: str
v458: str
v459: str
v460: str
v461: str
v462: str
v463: str
v464: str
v465: str
v466: str
v467: str
v468: str
v469: str
v470: str
v471: str
v472: str
v473: str
v474: str
v475: str
v476: str
v477: str
v478: str
v479: str
v480: str
v481: str
v482: str
v483: str
v484: str
v485: str
v486: str
v487: str
v488: str
v489: str
v490: str
v491: str
v492: str
v493: str
v494: str
v495: str
v496: str
v497: str
v498: str
v499: str
v500: str
v501: str
v502: str
v503: str
v504: str
v505: str
v506: str
v507: str
v508: str
v509: str
v510: str
v511: str
v512: str
v513: str
v514: str
v515: str
v516: str
v517: str
v518: str
v519: str
v520: str
v521: str
v522: str
v523: str
v524: str
v525: str
v526: str
v527: str
v528: str
v529: str
v530: str
v531: str
v532: str
v533: str
v534: str
v535: str
v536: str
v537: str
v538: str
v539: str
v540: str
v541: str
v542: str
v543: str
v544: str
v545: str
v546: str
v547: str
v548: str
v549: str
v550: str
v551: str
v552: str
v553: str
v554: str
v555: str
v556: str
v557: str
v558: str
v559: str
v560: str
v561: str
v562: str
v563: str
v564: str
v565: str
v566: str
v567: str
v568: str
v569: str
v570: str
v571: str
v572: str
v573: str
v574: str
v575: str
v576: str
v577: str
v578: str
v579: str
v580: str
v581: str
v582: str
v583: str
v584: str
v585: str
v586: str
v587: str
v588: str
v589: str
v590: str
v591: str
v592: str
v593: str
v594: str
v595: str
v596: str
v597: str
v598: str
v599: str
v600: str
v601: str
v602: str
v603: str
v604: str
v605: str
v606: str
v607: str
v608: str
v609: str
v610: str
v611: str
v612: str
v613: str
v614: str
v615: str
v616: str
v617: str
v618: str
v619: str
v620: str
v621: str
v622: str
v623: str
v624: str
v625: str
v626: str
v627: str
v628: str
v629: str
v630: str
v631: str
v632: str
v633: str
v634: str
v635: str
v636: str
v637: str
v638: str
v639: str
v640: str
v641: str
v642: str
v643: str
v644: str
v645: str
v646: str
v647: str
v648: str
v649: str
v650: str
v651: str
v652: str
v653: str
v654: str
v655: str
v656: str
v657: str
v658: str
v659: str
v660: str
v661: str
v662: str
v663: str
v664: str
v665: str
v666: str
v667: str
v668: str
v669: str
v670: str
v671: str
v672: str
v673: str
v674: str
v675: str
v676: str
v677: str
v678: str
v679: str
v680: str
v681: str
v682: str
v683: str
v684: str
v685: str
v686: str
v687: str
v688: str
v689: str
v690: str
v691: str
v692: str
v693: str
v694: str
v695: str
v696: str
v697: str
v698: str
v699: str
v700: str
v701: str
v702: str
v703: str
v704: str
v705: str
v706: str
v707: str
v708: str
v709: str
v710: str
v711: str
v712: str
v713: str
v714: str
v715: str
v716: str
v717: str
v718: str
v719: str
v720: str
v721: str
v722: str
v723: str
v724: str
v725: str
v726: str
v727: str
v728: str
v729: str
v730: str
v731: str
v732: str
v733: str
v734: str
v735: str
v736: str
v737: str
v738: str
v739: str
v740: str
v741: str
v742: str
v743: str
v744: str
v745: str
v746: str
v747: str
v748: str
v749: str
v750: str
v751: str
v752: str
v753: str
v754: str
v755: str
v756: str
v757: str
v758: str
v759: str
v760: str
v761: str
v762: str
v763: str
v764: str
v765: str
v766: str
v767: str
v768: str
v769: str
v770: str
v771: str
v772: str
v773: str
v774: str
v775: str
v776: str
v777: str
v778: str
v779: str
v780: str
v781: str
v782: str
v783: str
v784: str
v785: str
v786: str
v787: str
v788: str
v789: str
v790: str
v791: str
v792: str
v793: str
v794: str
v795: str
v796: str
v797: str
v798: str
v799: str
v800: str
v801: str
v802: str
v803: str
v804: str
v805: str
v806: str
v807: str
v808: str
v809: str
v810: str
v811: str
v812: str
v813: str
v814: str
v815: str
v816: str
v817: str
v818: str
v819: str
v820: str
v821: str
v822: str
v823: str
v824: str
v825: str
v826: str
v827: str
v828: str
v829: str
v830: str
v831: str
v832: str
v833: str
v834: str
v835: str
v836: str
v837: str
v838: str
v839: str
v840: str
v841: str
v842: str
v843: str
v844: str
v845: str
v846: str
v847: str
v848: str
v849: str
v850: str
v851: str
v852: str
v853: str
v854: str
v855: str
v856: str
v857: str
v858: str
v859: str
v860: str
v861: str
v862: str
v863: str
v864: str
v865: str
v866: str
v867: str
v868: str
v869: str
v870: str
v871: str
v872: str
v873: str
v874: str
v875: str
v876: str
v877: str
v878: str
v879: str
v880: str
v881: str
v882: str
v883: str
v884: str
v885: str
v886: str
v887: str
v888: str
v889: str
v890: str
v891: str
v892: str
v893: str
v894: str
v895: str
v896: str
v897: str
v898: str
v899: str
v900: str
v901: str
v902: str
v903: str
v904: str
v905: str
v906: str
v907: str
v908: str
v909: str
v910: str
v911: str
v912: str
v913: str
v914: str
v915: str
v916: str
v917: str
v918: str
v919: str
v920: str
v921: str
v922: str
v923: str
v924: str
v925: str
v926: str
v927: str
v928: str
v929: str
v930: str
v931: str
v932: str
v933: str
v934: str
v935: str
v936: str
v937: str
v938: str
v939: str
v940: str
v941: str
v942: str
v943: str
v944: str
v945: str
v946: str
v947: str
v948: str
v949: str
v950: str
v951: str
v952: str
v953: str
v954: str
v955: str
v956: str
v957: str
v958: str
v959: str
v960: str
v961: str
v962: str
v963: str
v964: str
v965: str
v966: str
v967: str
v968: str
v969: str
v970: str
v971: str
v972: str
v973: str
v974: str
v975: str
v976: str
v977: str
v978: str
v979: str
v980: str
v981: str
v982: str
v983: str
v984: str
v985: str
v986: str
v987: str
v988: str
v989: str
v990: str
v991: str
v992: str
v993: str
v994: str
v995: str
v996: str
v997: str
v998: str
v999: str
DATACLASS = {
"10": DataKlass10,
"100": DataKlass100,
"1000": DataKlass1000
}
print("")
for s in (10, 100, 1000):
print("Number of elements: ", s)
print("-" * (len(str(s)) + len("Number of elements: ")))
print()
info = {f"v{x}": x for x in range(s)}
size_dict = dict(**info)
_D = namedtuple("_D", list(info.keys()))
size_namedtuple = _D(**info)
_K = Klass(**info)
_K.__slots__ = list(info.keys())
Klass2 = Klass
Klass2.__slots__ = list(info.keys())
_K2 = Klass2(**info)
dataclass = DATACLASS[str(s)](**info)
print("Dict: ", sys.getsizeof(size_dict), "bytes #", getsize(size_dict), " bytes")
print("Namedtuple: ", sys.getsizeof(size_namedtuple), "bytes #",
getsize(size_namedtuple), " bytes")
print("Class: ", sys.getsizeof(_K), "bytes #", getsize(_K), " bytes")
print("Class Slots: ", sys.getsizeof(_K2), "bytes #", getsize(_K2), " bytes")
print("Dataclass: ", sys.getsizeof(dataclass), "bytes #", getsize(dataclass), " bytes")
print("")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment