ML iNdZddlmZddlZddlZddlmZddlmZddl m Z ddl m Z m Z ddlmZdd lmZd d Zddd Zdd Zy)zUtility for dumping memory usage stats. This is tailored to mypy and knows (a little) about which list objects are owned by particular AST nodes, etc. ) annotationsN) defaultdict)Iterable)cast)FakeInfoNode)Type)get_class_descriptorsctj}t|i}|D]?}t|turt|j }t |dr|d|t|j<t|ttfsit |drb|jjD]E}t|tr|d|t|<t|ts5|d|t|<Gtt|D]R}t!||d}t|tr|d|t|<t|tsB|d|t|<TBi}i}|D]v}t||vr|t|}nt|j }|j#|ddz||<|j#|dt%j&|z||<x||fS)zReturn stats about memory use. Return a tuple with these items: - Dict from object kind to number of instances of that kind - Dict from object kind to total bytes used by all instances of that kind __dict__z (__dict__)z (list)z (tuple)Nr)gc get_objectsfind_recursive_objectstyper__name__hasattridr isinstancerr valueslisttupler getattrgetsys getsizeof) objsinferredobjnxkfreqsmemusenames U/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mypy/memprofile.pycollect_memory_statsr's >> D4 H5 9  I   3 #,-3k):HR % & cD$< (sJ',,.9A!!T*-.Cw-A!!U+-.Cx.A 9+495 5CD)a&)*7mHRUOa')*8nHRUO  5%52EF@ c7h BsG$D9%%Diia(1,d zz$*S]]3-??t @ &=c tjjds*ddl}|j |j j }nd}|rtjt\}}tddztdd}d}t|jdD]1\}}||} |d krtd | |d z|| z |fz|d z }||z }3ttd |d ztd|d zy)Nwinrz%7s %7s %7s %s)FreqzSize(k)AvgSizer z+-------------------------------------------c|d S)Nr )r!s r&z&print_memory_profile..Ss !ur()key2z%7d %7d %7.0f %sir zMem usage RSS zTotal reachable ) rplatform startswithresource getrusage RUSAGE_SELF ru_maxrssrcollectr'printsorteditems) run_gcr5 system_memuser#r$totalmemir memfs r&print_memory_profilerCEs << " "5 ) **8+?+?@JJ    (*ME6  F FG 78H A_=3 !H r6 '1cTk37A*FF G QC   G mt34 h$./r(c  Dchc] }t|c} d fd }jD]}t|turt|tt fvrCt tttf|jD]\}}||||t|tttfvr$t tt|D] }|| t|dstjt|D]3}t|ddD]!}t||s|t||#5ycc}w)zFind additional objects referenced by objs and append them to objs. We use this since gc.get_objects() does not return objects without pointers in them such as strings. cxt|vr,j|jt|yy)N)rappendadd)orseens r&visitz%find_recursive_objects..visitfs. a5  KKN HHRUO r( __slots__r/N)rHobjectreturnNone)rcopyrrdictrrrLr<rrsetrrmror) rrHrJrr1valr!baseslotrIs ` @r&rr^s"  aBqE D yy{2 9  9{+ + ffn!5s;AAC Sc c   9uc* *(6*C0 a  3 $c+ 2#D+r:2DsD)gc4012 22 !sE)rMz%tuple[dict[str, int], dict[str, int]])T)r=boolrMrN)rz list[object]rMrN)__doc__ __future__rrr collectionsrcollections.abcrtypingr mypy.nodesrr mypy.typesr mypy.utilr r'rCrr/r(r&r_s7 # #$%+.b022r(