muppy.py (4171B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\pympler\muppy.py 2 from __future__ import print_function 3 import gc 4 from pympler import summary 5 from pympler.util import compat 6 from inspect import isframe, stack 7 try: 8 from sys import getsizeof as _getsizeof 9 except ImportError: 10 from pympler.asizeof import flatsize 11 _getsizeof = flatsize 12 13 __TPFLAGS_HAVE_GC = 16384 14 15 def get_objects(remove_dups = True, include_frames = False): 16 gc.collect() 17 tmp = gc.get_objects() 18 tmp = [ o for o in tmp if not isframe(o) ] 19 res = [] 20 for o in tmp: 21 refs = get_referents(o) 22 for ref in refs: 23 if not _is_containerobject(ref): 24 res.append(ref) 25 26 res.extend(tmp) 27 if remove_dups: 28 res = _remove_duplicates(res) 29 if include_frames: 30 for sf in stack()[2:]: 31 res.append(sf[0]) 32 33 return res 34 35 36 def get_size(objects): 37 res = 0 38 for o in objects: 39 try: 40 res += _getsizeof(o) 41 except AttributeError: 42 print('IGNORING: type=%s; o=%s' % (str(type(o)), str(o))) 43 44 return res 45 46 47 def get_diff(left, right): 48 res = {'+': [], 49 '-': []} 50 51 def partition(objects): 52 res = {} 53 for o in objects: 54 t = type(o) 55 if type(o) not in res: 56 res[t] = [] 57 res[t].append(o) 58 59 return res 60 61 def get_not_included(foo, bar): 62 res = [] 63 for o in foo: 64 if not compat.object_in_list(type(o), bar): 65 res.append(o) 66 elif not compat.object_in_list(o, bar[type(o)]): 67 res.append(o) 68 69 return res 70 71 left_objects = partition(left) 72 right_objects = partition(right) 73 res['+'] = get_not_included(right, left_objects) 74 res['-'] = get_not_included(left, right_objects) 75 return res 76 77 78 def sort(objects): 79 objects = sorted(objects, key=_getsizeof) 80 return objects 81 82 83 def filter(objects, Type = None, min = -1, max = -1): 84 res = [] 85 if min > max: 86 raise ValueError('minimum must be smaller than maximum') 87 if Type is not None: 88 res = [ o for o in objects if isinstance(o, Type) ] 89 if min > -1: 90 res = [ o for o in res if _getsizeof(o) < min ] 91 if max > -1: 92 res = [ o for o in res if _getsizeof(o) > max ] 93 return res 94 95 96 def get_referents(object, level = 1): 97 res = gc.get_referents(object) 98 level -= 1 99 if level > 0: 100 for o in res: 101 res.extend(get_referents(o, level)) 102 103 res = _remove_duplicates(res) 104 return res 105 106 107 def _get_usage(function, *args): 108 res = None 109 110 def _get_summaries(function, *args): 111 s_before = summary.summarize(get_objects()) 112 function(*args) 113 s_after = summary.summarize(get_objects()) 114 return (s_before, s_after) 115 116 def _get_usage(function, *args): 117 res = [] 118 s_before, s_after = _get_summaries(function, *args) 119 ignore = [] 120 if s_before != s_after: 121 ignore.append(s_before) 122 for row in s_before: 123 if len(gc.get_referrers(row)) == 2: 124 ignore.append(row) 125 for item in row: 126 if len(gc.get_referrers(item)) == 2: 127 ignore.append(item) 128 129 for o in ignore: 130 s_after = summary._subtract(s_after, o) 131 132 res = summary.get_diff(s_before, s_after) 133 return summary._sweep(res) 134 135 def noop(): 136 pass 137 138 offset = _get_usage(noop) 139 offset = _get_usage(noop) 140 tmp = _get_usage(function, *args) 141 tmp = _get_usage(function, *args) 142 tmp = summary.get_diff(offset, tmp) 143 tmp = summary._sweep(tmp) 144 if len(tmp) != 0: 145 res = tmp 146 return res 147 148 149 def _is_containerobject(o): 150 if type(o).__flags__ & __TPFLAGS_HAVE_GC == 0: 151 return False 152 else: 153 return True 154 155 156 def _remove_duplicates(objects): 157 seen = set() 158 result = [] 159 for item in objects: 160 marker = id(item) 161 if marker in seen: 162 continue 163 seen.add(marker) 164 result.append(item) 165 166 return result 167 168 169 def print_summary(): 170 summary.print_(summary.summarize(get_objects()))