NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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()))