o ?OgF@sddlmZmZddlmZddlZddlZddlZddl Z ddl Tddl m Z m Z ddZ Gdd d ZGd d d Zd d ZeGdddZeGdddeZddZGdddZGdddeZddZGdddZGdddeZGdddeZGd d!d!Zd"d#ZdS)$)SequenceIterable)total_orderingN)*)_get_object_traceback _get_tracescCsdD]>}t|dkr |dkr |rd||fSd||fSt|dks*|dkr<|r4d||fSd ||fS|d }qdS) N)BZKiBZMiBZGiBTiBdrz%+.1f %sz%.1f %si(r z%+.0f %sz%.0f %si)abs)sizeZsignZunitr 2/opt/alt/python310/lib64/python3.10/tracemalloc.py _format_size s rc@DeZdZdZdZddZddZddZd d Zd d Z d dZ dS) StatisticzS Statistic difference on memory allocations between two Snapshot instance.  tracebackr countcCs||_||_||_dSNr)selfrr rr r r__init__%s zStatistic.__init__cCst|j|j|jfSr)hashrr rrr r r__hash__*zStatistic.__hash__cCs2t|tstS|j|jko|j|jko|j|jkSr) isinstancerNotImplementedrr rrotherr r r__eq__-s    zStatistic.__eq__cCsBd|jt|jd|jf}|jr|j|j}|dt|d7}|S)Nz%s: size=%s, count=%iF , average=%s)rrr rrtextZaverager r r__str__4s  zStatistic.__str__cCsd|j|j|jfS)Nz)rrr r r__repr__>szStatistic.__repr__cCs|j|j|jfSr)r rrrr r r _sort_keyBzStatistic._sort_keyN __name__ __module__ __qualname____doc__ __slots__rrr r$r%r&r r r rrs rc@r) StatisticDiffzd Statistic difference on memory allocations between an old and a new Snapshot instance. rr size_diffr count_diffcCs"||_||_||_||_||_dSrr/)rrr r0rr1r r rrMs  zStatisticDiff.__init__cCst|j|j|j|j|jfSr)rrr r0rr1rr r rrTszStatisticDiff.__hash__cCsJt|tstS|j|jko$|j|jko$|j|jko$|j|jko$|j|jkSr)rr.rrr r0rr1rr r rr Xs      zStatisticDiff.__eq__cCsPd|jt|jdt|jd|j|jf}|jr&|j|j}|dt|d7}|S)Nz %s: size=%s (%s), count=%i (%+i)FTr!)rrr r0rr1r"r r rr$as   zStatisticDiff.__str__cCsd|j|j|j|j|jfS)Nz9r/rr r rr%ms  zStatisticDiff.__repr__cCs t|j|jt|j|j|jfSr)r r0r r1rrrr r rr&rs  zStatisticDiff._sort_keyNr(r r r rr.Fs  r.cCsg}|D]2\}}||d}|dur't||j|j|j|j|j|j}n t||j|j|j|j}||q|D]\}}t|d|j d|j }||q=|SNr)itemspopr.r rappend) old_group new_group statisticsrstatZpreviousr r r_compare_grouped_statsxs"   r:c@s\eZdZdZdZddZeddZeddZd d Z d d Z d dZ ddZ ddZ dS)Framez Frame of a traceback. _framecC ||_dSrr<rframer r rr zFrame.__init__cC |jdSr2r<rr r rfilenamerAzFrame.filenamecCrBNr<rr r rlinenorAz Frame.linenocCt|tstS|j|jkSrrr;rr=rr r rr   z Frame.__eq__cCt|tstS|j|jkSrrHrr r r__lt__rIz Frame.__lt__cC t|jSr)rr=rr r rr zFrame.__hash__cCd|j|jfS)Nz%s:%srCrFrr r rr$r'z Frame.__str__cCrN)NzrOrr r rr%r'zFrame.__repr__N)r)r*r+r,r-rpropertyrCrFr rKrr$r%r r r rr;s   r;c@steZdZdZdZdddZeddZdd Zd d Z d d Z ddZ ddZ ddZ ddZddZdddZdS) Tracebackz` Sequence of Frame instances sorted from the oldest frame to the most recent frame. )_frames _total_nframeNcCs"t|tt||_||_dSr)rrtuplereversedrRrS)rframes total_nframer r rrs  zTraceback.__init__cC|jSr)rSrr r rrWzTraceback.total_nframecCrLr)lenrRrr r r__len__rMzTraceback.__len__cC0t|trtdd|j|DSt|j|S)Ncs|]}t|VqdSr)r;.0tracer r r z(Traceback.__getitem__..)rslicerTrRr;rindexr r r __getitem__ zTraceback.__getitem__cC |j|jvSr)r=rRr?r r r __contains__ zTraceback.__contains__cCrLr)rrRrr r rrrMzTraceback.__hash__cCrGrrrQrrRrr r rr rIzTraceback.__eq__cCrJrrkrr r rrKrIzTraceback.__lt__cCs t|dSr2)strrr r rr$rjzTraceback.__str__cCs:dt|}|jdur|d7}|S|d|jd7}|S)Nz z total_nframe=)rTrSrW)rsr r rr%s  zTraceback.__repr__FcCsg}|dur|dkr|| d}n |d|}n|}|r!t|}|D] }|d|j|jft|j|j}|rC|d|q#|S)Nrz File "%s", line %sz %s)rUr5rCrF linecachegetlinestrip)rlimitZmost_recent_firstlinesZ frame_slicer@liner r rformats" zTraceback.formatr)NF)r)r*r+r,r-rrPrWr[rfrirr rKr$r%rur r r rrQs  rQcCst|}|dur t|SdS)z Get the traceback where the Python object *obj* was allocated. Return a Traceback instance. Return None if the tracemalloc module is not tracing memory allocations or did not trace the allocation of the object. N)rrQ)objrVr r rget_object_tracebacksrwc@s`eZdZdZdZddZeddZeddZed d Z d d Z d dZ ddZ ddZ dS)Tracez" Trace of a memory block. _tracecCr>rryrr`r r rrs zTrace.__init__cCrBr2ryrr r rdomainrAz Trace.domaincCrBrDryrr r rr rAz Trace.sizecCst|jddS)N)rQrzrr r rr#szTrace.tracebackcCrGr)rrxrrzrr r rr 'rIz Trace.__eq__cCrLr)rrzrr r rr,rMzTrace.__hash__cCsd|jt|jdfS)Nz%s: %sF)rrr rr r rr$/sz Trace.__str__cCsd|jt|jd|jfS)Nz'F)r|rr rrr r rr%2szTrace.__repr__N)r)r*r+r,r-rrPr|r rr rr$r%r r r rrxs    rxc@s<eZdZddZddZddZddZd d Zd d Zd S)_TracescCst|||_dSr)rr_traces)rtracesr r rr8s  z_Traces.__init__cCrLr)rZrrr r rr[=rMz_Traces.__len__cCr\)Ncsr]r)rxr^r r rraBrbz&_Traces.__getitem__..)rrcrTrrxrdr r rrf@rgz_Traces.__getitem__cCrhr)rzrr{r r rriFrjz_Traces.__contains__cCrGr)rr~rrrr r rr IrIz_Traces.__eq__cCs dt|S)Nz)rZrr r rr%Nrjz_Traces.__repr__N) r)r*r+rr[rfrir r%r r r rr~7s r~cCs&tj|}|dr|dd}|S)Nz.pyc)ospathnormcaseendswith)rCr r r_normalize_filenameRs   rc@seZdZddZddZdS) BaseFiltercCr>r) inclusive)rrr r rrZrMzBaseFilter.__init__cCstr)NotImplementedErrorr{r r r_match]szBaseFilter._matchN)r)r*r+rrr r r rrYs rcsLeZdZ dfdd ZeddZddZd d Zd d Zd dZ Z S)FilterNFcs2t|||_t||_||_||_||_dSr)superrrr_filename_patternrF all_framesr|)rrfilename_patternrFrr| __class__r rrbs   zFilter.__init__cCrXr)rrr r rrkrYzFilter.filename_patterncCs2t|}t||js dS|jdurdS||jkS)NFT)rfnmatchrrFrrCrFr r r_match_frame_implos   zFilter._match_frame_implcCs||||j ASr)rrrr r r _match_framexrzFilter._match_framecsBjrtfdd|DrjSj S|d\}}||S)Nc3s |] \}}||VqdSr)r)r_rCrFrr rra}sz*Filter._match_traceback..r)ranyrr)rrrCrFr rr_match_traceback{s   zFilter._match_tracebackcCsF|\}}}}||}|jdur!|jr|o||jkS|p ||jkS|Sr)rr|r)rr`r|r rrWresr r rrs   z Filter._match)NFN) r)r*r+rrPrrrrr __classcell__r r rrras   rcs0eZdZfddZeddZddZZS) DomainFiltercst|||_dSr)rr_domain)rrr|rr rrs  zDomainFilter.__init__cCrXr)rrr r rr|rYzDomainFilter.domaincCs|\}}}}||jk|j ASr)r|r)rr`r|r rrWr r rrs zDomainFilter._match)r)r*r+rrPr|rrr r rrrs   rc@sXeZdZdZddZddZeddZdd Zd d Z d d Z dddZ dddZ dS)SnapshotzB Snapshot of traces of memory blocks allocated by Python. cCst||_||_dSr)r~rtraceback_limit)rrrr r rrs  zSnapshot.__init__cCs@t|d}t||tjWddS1swYdS)z1 Write the snapshot into a file. wbN)openpickledumpZHIGHEST_PROTOCOL)rrCfpr r rrs "z Snapshot.dumpcCs8t|d }t|WdS1swYdS)z. Load a snapshot from a file. rbN)rrload)rCrr r rrs $z Snapshot.loadcs@|rtfdd|DsdS|rtfdd|DrdSdS)Nc3s|]}|VqdSrrr_ trace_filterr`r rrasz)Snapshot._filter_trace..Fc3s|] }| VqdSrrrrr rrasT)r)rinclude_filtersexclude_filtersr`r rr _filter_traces  zSnapshot._filter_tracecst|tstdt|j|r5gg|D]}|jr!|q|qfddjjD}njj }t |j S)z Create a new Snapshot instance with a filtered traces sequence, filters is a list of Filter or DomainFilter instances. If filters is an empty list, return a new Snapshot instance with a copy of the traces. z)filters must be a list of filters, not %scsg|] }|r|qSr )rr^rrrr r s  z*Snapshot.filter_traces..) rr TypeErrortyper)rr5rrcopyrr)rfiltersrZ new_tracesr rr filter_tracess     zSnapshot.filter_tracesc Cs|dvr td|f|r|dvrtd|i}i}|s|jjD]`}|\}}}} z||} Wn,ty[|dkr=|} n|dkrH|dd} n |dddff} t| } | ||<Ynwz|| } | j|7_| jd7_Wq!tyt| |d|| <Yq!w|S|jjD]Y}|\}}}} |D]N} z|| } Wn ty|dkr| f} n| ddff} t| } | || <Ynwz|| } | j|7_| jd7_Wqtyt| |d|| <Yqwq|S) N)rrCrFzunknown key_type: %r)rFrCz/cumulative mode cannot by used with key type %rrrFrEr) ValueErrorrrKeyErrorrQr rr)rkey_type cumulativeZstatsZ tracebacksr`r|r Ztrace_tracebackrWrrVr9r@r r r _group_bysf             zSnapshot._group_byFcCs,|||}t|}|jdtjd|S)zd Group statistics by key_type. Return a sorted list of Statistic instances. Treversekey)rlistvaluessortrr&)rrrZgroupedr8r r rr8s  zSnapshot.statisticscCs6|||}|||}t||}|jdtjd|S)z Compute the differences with an old snapshot old_snapshot. Get statistics as a sorted list of StatisticDiff instances, grouped by group_by. Tr)rr:rr.r&)rZ old_snapshotrrr7r6r8r r r compare_tos   zSnapshot.compare_toN)F) r)r*r+r,rr staticmethodrrrrr8rr r r rrs   3 rcCs$tstdt}t}t||S)zI Take a snapshot of traces of memory blocks allocated by Python. zLthe tracemalloc module must be tracing memory allocations to take a snapshot) is_tracing RuntimeErrorrZget_traceback_limitr)rrr r r take_snapshot's  r)Zcollections.abcrr functoolsrrroZos.pathrrZ _tracemallocrrrrr.r:r;rQrwrxr~rrrrrrr r r rs4 (2&M'0