Created
April 22, 2020 08:53
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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