o 0¦iFã@sddlmZmZddlmZddlZddlZddlZddl Z ddl Tddl m Z m Z dd„Z Gdd „d ƒZGd d „d ƒZd d „ZeGdd„dƒƒZeGdd„deƒƒZdd„ZGdd„dƒZGdd„deƒZdd„ZGdd„dƒZGdd„deƒZGdd„deƒZGd d!„d!ƒZd"d#„ZdS)$é)ÚSequenceÚIterable)Útotal_orderingN)Ú*)Ú_get_object_tracebackÚ _get_tracescCs†dD]>}t|ƒdkr |dkr |rd||fSd||fSt|ƒdks*|dkr<|r4d||fSd ||fS|d }qdS) N)ÚBZKiBZMiBZGiBÚTiBédrz%+.1f %sz%.1f %si(r z%+.0f %sz%.0f %si)Úabs)ÚsizeZsignZunit©r ú2/opt/alt/python310/lib64/python3.10/tracemalloc.pyÚ _format_size s órc@óDeZdZdZdZdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dS)Ú StatisticzS Statistic difference on memory allocations between two Snapshot instance. ©Ú tracebackr ÚcountcCs||_||_||_dS©Nr)Úselfrr rr r rÚ__init__%s zStatistic.__init__cCst|j|j|jfƒSr)Úhashrr r©rr r rÚ__hash__*ózStatistic.__hash__cCs2t|tƒstS|j|jko|j|jko|j|jkSr)Ú isinstancerÚNotImplementedrr r©rÚotherr r rÚ__eq__-s   ÿ þzStatistic.__eq__cCsBd|jt|jdƒ|jf}|jr|j|j}|dt|dƒ7}|S)Nz%s: size=%s, count=%iFú , average=%s)rrr r©rÚtextZaverager r rÚ__str__4s þÿ zStatistic.__str__cCsd|j|j|jfS)Nz)rrr r rÚ__repr__>sÿzStatistic.__repr__cCs|j|j|jfSr)r rrrr r rÚ _sort_keyBózStatistic._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|jfƒSr)rrr r0rr1rr r rrTsÿzStatisticDiff.__hash__cCsJt|tƒstS|j|jko$|j|jko$|j|jko$|j|jko$|j|jkSr)rr.rrr r0rr1rr r rr Xs   ÿ þ ý üzStatisticDiff.__eq__cCsPd|jt|jdƒt|jdƒ|j|jf}|jr&|j|j}|dt|dƒ7}|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.cCsªg}| ¡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=|S©Nr)ÚitemsÚpopr.r rÚappend)Ú old_groupÚ new_groupÚ statisticsrÚstatZpreviousr r rÚ_compare_grouped_statsxs" þþ  r:c@s\eZdZdZdZdd„Zedd„ƒZedd„ƒZd d „Z d d „Z d d„Z dd„Z dd„Z dS)ÚFramez Frame of a traceback. ©Ú_framecCó ||_dSrr<©rÚframer r rr“ó zFrame.__init__cCó |jdSr2r<rr r rÚfilename—rAzFrame.filenamecCrB©Nér<rr r rÚlineno›rAz Frame.linenocCót|tƒstS|j|jkSr©rr;rr=rr r rr Ÿó  z Frame.__eq__cCót|tƒstS|j|jkSrrHrr r rÚ__lt__¤rIz Frame.__lt__cCó t|jƒSr)rr=rr r rr©ó zFrame.__hash__cCód|j|jfS)Nz%s:%s©rCrFrr r rr$¬r'z Frame.__str__cCrN)NzrOrr r rr%¯r'zFrame.__repr__N)r)r*r+r,r-rÚpropertyrCrFr rKrr$r%r r r rr;Œs   r;c@steZdZdZdZddd„Zedd„ƒZdd „Zd d „Z d d „Z dd„Z dd„Z dd„Z dd„Zdd„Zddd„ZdS)Ú Tracebackz` Sequence of Frame instances sorted from the oldest frame to the most recent frame. )Ú_framesÚ _total_nframeNcCs"t |¡tt|ƒƒ|_||_dSr)rrÚtupleÚreversedrRrS)rÚframesÚ total_nframer r rr»s  zTraceback.__init__cCó|jSr)rSrr r rrWÄózTraceback.total_nframecCrLr)ÚlenrRrr r rÚ__len__ÈrMzTraceback.__len__cCó0t|tƒrtdd„|j|DƒƒSt|j|ƒS)Ncsó�|]}t|ƒVqdSr)r;©Ú.0Útracer r rÚ Íó€z(Traceback.__getitem__..)rÚslicerTrRr;©rÚindexr r rÚ __getitem__Ëó zTraceback.__getitem__cCó |j|jvSr)r=rRr?r r rÚ __contains__Ñó zTraceback.__contains__cCrLr)rrRrr r rrÔrMzTraceback.__hash__cCrGr©rrQrrRrr r rr ×rIzTraceback.__eq__cCrJrrkrr r rrKÜrIzTraceback.__lt__cCs t|dƒSr2)Ústrrr r rr$árjzTraceback.__str__cCs:dt|ƒ›�}|jdur|d7}|S|d|j›d�7}|S)Nz z total_nframe=)rTrSrW)rÚsr r rr%äs  ÿzTraceback.__repr__FcCsŒg}|dur|dkr|| d…}n |d|…}n|}|r!t|ƒ}|D] }| d|j|jf¡t |j|j¡ ¡}|rC| d|¡q#|S)Nrz File "%s", line %sz %s)rUr5rCrFÚ linecacheÚgetlineÚstrip)rÚlimitZmost_recent_firstÚlinesZ frame_slicer@Úliner r rÚformatìs" ÿ€zTraceback.formatr)NF)r)r*r+r,r-rrPrWr[rfrirr rKr$r%rur r r rrQ³s  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 rÚget_object_tracebacksrwc@s`eZdZdZdZdd„Zedd„ƒZedd„ƒZed d „ƒZ d d „Z d d„Z dd„Z dd„Z dS)ÚTracez" Trace of a memory block. ©Ú_tracecCr>rry©rr`r r rrs zTrace.__init__cCrBr2ryrr r rÚdomainrAz Trace.domaincCrBrDryrr r rr rAz Trace.sizecCst|jdd…ŽS)Né)rQrzrr r rr#szTrace.tracebackcCrGr)rrxrrzrr r rr 'rIz Trace.__eq__cCrLr)rrzrr r rr,rMzTrace.__hash__cCsd|jt|jdƒfS)Nz%s: %sF)rrr rr r rr$/sz Trace.__str__cCsd|jt|jdƒ|jfS)Nz'F)r|rr rrr r rr%2sÿzTrace.__repr__N)r)r*r+r,r-rrPr|r rr rr$r%r r r rrxs    rxc@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)Ú_TracescCst |¡||_dSr)rrÚ_traces)rÚtracesr 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 |¡}| d¡r|dd…}|S)Nz.pycéÿÿÿÿ)ÚosÚpathÚnormcaseÚendswith)rCr r rÚ_normalize_filenameRs   r†c@seZdZdd„Zdd„ZdS)Ú BaseFiltercCr>r)Ú inclusive)rrˆr r rrZrMzBaseFilter.__init__cCst‚r)ÚNotImplementedErrorr{r r rÚ_match]szBaseFilter._matchN)r)r*r+rrŠr r r rr‡Ys r‡csLeZdZ d‡fdd„ Zedd„ƒZdd„Zd d „Zd d „Zd d„Z ‡Z S)ÚFilterNFcs2tƒ |¡||_t|ƒ|_||_||_||_dSr)Úsuperrrˆr†Ú_filename_patternrFÚ all_framesr|)rrˆÚfilename_patternrFrŽr|©Ú __class__r rrbs   zFilter.__init__cCrXr)r�rr r rr�krYzFilter.filename_patterncCs2t|ƒ}t ||j¡s dS|jdurdS||jkS)NFT)r†Úfnmatchr�rF©rrCrFr r rÚ_match_frame_implos   zFilter._match_frame_implcCs| ||¡|j ASr)r”rˆr“r r rÚ _match_framexrzFilter._match_framecsBˆjrt‡fdd„|DƒƒrˆjSˆj S|d\}}ˆ ||¡S)Nc3s �|] \}}ˆ ||¡VqdSr)r”)r_rCrFrr rra}s€ÿz*Filter._match_traceback..r)rŽÚanyrˆr•)rrrCrFr rrÚ_match_traceback{s ÿ  zFilter._match_tracebackcCsF|\}}}}| |¡}|jdur!|jr|o||jkS|p ||jkS|Sr)r—r|rˆ)rr`r|r rrWÚresr r rrІs   z Filter._match)NFN) r)r*r+rrPr�r”r•r—rŠÚ __classcell__r r r�rr‹asÿ   r‹cs0eZdZ‡fdd„Zedd„ƒZdd„Z‡ZS)Ú DomainFiltercstƒ |¡||_dSr)rŒrÚ_domain)rrˆr|r�r rr’s  zDomainFilter.__init__cCrXr)r›rr r rr|–rYzDomainFilter.domaincCs|\}}}}||jk|j ASr)r|rˆ)rr`r|r rrWr r rrŠšs zDomainFilter._match)r)r*r+rrPr|rŠr™r r r�rrš‘s   ršc@sXeZdZdZdd„Zdd„Zedd„ƒZdd „Zd d „Z d d „Z ddd„Z ddd„Z dS)ÚSnapshotzB Snapshot of traces of memory blocks allocated by Python. cCst|ƒ|_||_dSr)r~r€Útraceback_limit)rr€r�r r rr¤s  zSnapshot.__init__cCs@t|dƒ�}t ||tj¡WdƒdS1swYdS)z1 Write the snapshot into a file. ÚwbN)ÚopenÚpickleÚdumpZHIGHEST_PROTOCOL)rrCÚfpr r rr¡ªs "ÿz Snapshot.dumpcCs8t|dƒ� }t |¡WdƒS1swYdS)z. Load a snapshot from a file. ÚrbN)rŸr Úload)rCr¢r r rr¤±s $ÿz Snapshot.loadcs@|rt‡fdd„|DƒƒsdS|rt‡fdd„|DƒƒrdSdS)Nc3s�|]}| ˆ¡VqdSr©rŠ©r_Ú trace_filter©r`r rra»s€ÿz)Snapshot._filter_trace..Fc3s�|] }| ˆ¡ VqdSrr¥r¦r¨r rra¿s€ÿT)r–)rÚinclude_filtersÚexclude_filtersr`r r¨rÚ _filter_trace¹s ÿ ÿzSnapshot._filter_tracecs‚t|tƒstdt|ƒjƒ‚|r5g‰g‰|D]}|jr!ˆ |¡qˆ |¡q‡‡‡fdd„ˆjjDƒ}nˆjj  ¡}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 )r«r^©rªr©rr rÚ Õs þ ÿz*Snapshot.filter_traces..) rrÚ TypeErrorÚtyper)rˆr5r€rÚcopyrœr�)rÚfiltersr§Z new_tracesr r¬rÚ filter_tracesÄs ÿ    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!ty�t| |dƒ|| <Yq!w|S|jjD]Y}|\}}}} |D]N} z|| } Wn tyº|dkr©| f} n| ddff} t| ƒ} | || <Ynwz|| } | j|7_| jd7_Wq’tyàt| |dƒ|| <Yq’wqˆ|S) N)rrCrFzunknown key_type: %r)rFrCz/cumulative mode cannot by used with key type %rrrFrEr)Ú ValueErrorr€rÚKeyErrorrQr rr)rÚkey_typeÚ cumulativeZstatsZ tracebacksr`r|r Ztrace_tracebackrWrrVr9r@r r rÚ _group_byÝsf ÿ     ø  ÿ î    ú ÿòzSnapshot._group_byFcCs,| ||¡}t| ¡ƒ}|jdtjd�|S)zd Group statistics by key_type. Return a sorted list of Statistic instances. T©ÚreverseÚkey)r·ÚlistÚvaluesÚsortrr&)rrµr¶Zgroupedr8r 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¸)r·r:r½r.r&)rZ old_snapshotrµr¶r7r6r8r r rÚ compare_tos   zSnapshot.compare_toN)F) r)r*r+r,rr¡Ú staticmethodr¤r«r²r·r8r¾r r r rrœŸs   3 rœcCs$tƒstdƒ‚tƒ}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œ)r€r�r r rÚ take_snapshot's  rÂ)Zcollections.abcrrÚ functoolsrr’roZos.pathr‚r Z _tracemallocrrrrr.r:r;rQrwrxr~r†r‡r‹ršrœrÂr r r rÚs4 (2&M'0