U e5d´Bã@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@|r0d||fSd||fSt|ƒdksT|dkrx|rhd||fSd ||fS|d }qdS) N)ÚBZKiBZMiBZGiBÚTiBédrz%+.1f %sz%.1f %si(r z%+.0f %sz%.0f %si)Úabs)ÚsizeZsignZunit©r ú#/usr/lib64/python3.8/tracemalloc.pyÚ _format_size src@sDeZdZdZdZdd„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__%szStatistic.__init__cCst|j|j|jfƒSr)Úhashrr r©rr r rÚ__hash__*szStatistic.__hash__cCs$|j|jko"|j|jko"|j|jkSrr©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__2s þÿ zStatistic.__str__cCsd|j|j|jfS)Nz)rrr r rÚ__repr__<sÿzStatistic.__repr__cCs|j|j|jfSr)r rrrr r rÚ _sort_key@szStatistic._sort_keyN© Ú__name__Ú __module__Ú __qualname__Ú__doc__Ú __slots__rrrr r!r"r r r rrs rc@sDeZdZdZdZdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dS)Ú StatisticDiffzd Statistic difference on memory allocations between an old and a new Snapshot instance. ©rr Ú size_diffrÚ count_diffcCs"||_||_||_||_||_dSrr*)rrr r+rr,r r rrKs zStatisticDiff.__init__cCst|j|j|j|j|jfƒSr)rrr r+rr,rr r rrRsÿzStatisticDiff.__hash__cCs<|j|jko:|j|jko:|j|jko:|j|jko:|j|jkSrr*rr r rrVs  ÿ þ ý üzStatisticDiff.__eq__cCsPd|jt|jdƒt|jdƒ|j|jf}|jrL|j|j}|dt|dƒ7}|S)Nz %s: size=%s (%s), count=%i (%+i)FTr)rrr r+rr,rr r rr ]s  üÿ zStatisticDiff.__str__cCsd|j|j|j|j|jfS)Nz9r*rr r rr!is  ÿÿzStatisticDiff.__repr__cCs t|jƒ|jt|jƒ|j|jfSr)r r+r r,rrrr r rr"ns  þzStatisticDiff._sort_keyNr#r r r rr)Ds r)cCsªg}| ¡D]d\}}| |d¡}|dk rNt||j|j|j|j|j|jƒ}nt||j|j|j|jƒ}| |¡q | ¡D]*\}}t|d|j d|j ƒ}| |¡qz|S©Nr)ÚitemsÚpopr)r rÚappend)Ú old_groupÚ new_groupÚ statisticsrÚstatZpreviousr r rÚ_compare_grouped_statsts*   þþ  r5c@s\eZdZdZdZdd„Zedd„ƒZedd„ƒZd d „Z d d „Z d d„Z dd„Z dd„Z dS)ÚFramez Frame of a traceback. ©Ú_framecCs ||_dSrr7©rÚframer r rr�szFrame.__init__cCs |jdSr-r7rr r rÚfilename“szFrame.filenamecCs |jdS©Nér7rr r rÚlineno—sz Frame.linenocCs |j|jkSrr7rr r rr›sz Frame.__eq__cCs |j|jkSrr7rr r rÚ__lt__žsz Frame.__lt__cCs t|jƒSr)rr8rr r rr¡szFrame.__hash__cCsd|j|jfS)Nz%s:%s©r;r>rr r rr ¤sz Frame.__str__cCsd|j|jfS)Nzr@rr r rr!§szFrame.__repr__N)r$r%r&r'r(rÚpropertyr;r>rr?rr r!r r r rr6ˆs  r6c@sfeZdZdZdZdd„Zdd„Zdd„Zd d „Zd d „Z d d„Z dd„Z dd„Z dd„Z ddd„ZdS)Ú Tracebackz` Sequence of Frame instances sorted from the oldest frame to the most recent frame. ©Ú_framescCst |¡tt|ƒƒ|_dSr)rrÚtupleÚreversedrD)rÚframesr r rr³s zTraceback.__init__cCs t|jƒSr)ÚlenrDrr r rÚ__len__»szTraceback.__len__cCs4t|tƒr"tdd„|j|DƒƒSt|j|ƒSdS)Ncss|]}t|ƒVqdSr)r6©Ú.0Útracer r rÚ Àsz(Traceback.__getitem__..)Ú isinstanceÚslicerErDr6©rÚindexr r rÚ __getitem__¾s zTraceback.__getitem__cCs |j|jkSr)r8rDr9r r rÚ __contains__ÄszTraceback.__contains__cCs t|jƒSr)rrDrr r rrÇszTraceback.__hash__cCs |j|jkSrrCrr r rrÊszTraceback.__eq__cCs |j|jkSrrCrr r rr?ÍszTraceback.__lt__cCs t|dƒSr-)Ústrrr r rr ÐszTraceback.__str__cCsdt|ƒfS)Nz)rErr r rr!ÓszTraceback.__repr__NFcCsŒg}|dk r2|dkr$|| d…}q6|d|…}n|}|rBt|ƒ}|D]@}| d|j|jf¡t |j|j¡ ¡}|rF| d|¡qF|S)Nrz File "%s", line %sz %s)rFr0r;r>Ú linecacheÚgetlineÚstrip)rÚlimitZmost_recent_firstÚlinesZ frame_slicer:Úliner r rÚformatÖs  ÿzTraceback.format)NF)r$r%r&r'r(rrIrRrSrrr?r r!r[r r r rrB«srBcCs t|ƒ}|dk rt|ƒSdSdS)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)rrB)ÚobjrGr r rÚget_object_tracebackësr]c@s`eZdZdZdZdd„Zedd„ƒZedd„ƒZed d „ƒZ d d „Z d d„Z dd„Z dd„Z dS)ÚTracez" Trace of a memory block. ©Ú_tracecCs ||_dSrr_©rrLr r rrszTrace.__init__cCs |jdSr-r_rr r rÚdomainsz Trace.domaincCs |jdSr<r_rr r rr sz Trace.sizecCst|jdƒS)Né)rBr`rr r rr szTrace.tracebackcCs |j|jkSrr_rr r rrsz Trace.__eq__cCs t|jƒSr)rr`rr r rrszTrace.__hash__cCsd|jt|jdƒfS)Nz%s: %sF)rrr rr r rr sz Trace.__str__cCsd|jt|jdƒ|jfS)Nz'F)rbrr rrr r rr!sÿzTrace.__repr__N)r$r%r&r'r(rrArbr rrrr r!r r r rr^ús   r^c@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)Ú_TracescCst |¡||_dSr)rrÚ_traces)rÚtracesr r rr s z_Traces.__init__cCs t|jƒSr)rHrerr r rrI%sz_Traces.__len__cCs4t|tƒr"tdd„|j|DƒƒSt|j|ƒSdS)Ncss|]}t|ƒVqdSr)r^rJr r rrM*sz&_Traces.__getitem__..)rNrOrErer^rPr r rrR(s z_Traces.__getitem__cCs |j|jkSr)r`rerar r rrS.sz_Traces.__contains__cCs |j|jkSr)rerr r rr1sz_Traces.__eq__cCs dt|ƒS)Nz)rHrr r rr!4sz_Traces.__repr__N) r$r%r&rrIrRrSrr!r r r rrds rdcCs&tj |¡}| d¡r"|dd…}|S)Nz.pycéÿÿÿÿ)ÚosÚpathÚnormcaseÚendswith)r;r r rÚ_normalize_filename8s   rlc@seZdZdd„Zdd„ZdS)Ú BaseFiltercCs ||_dSr)Ú inclusive)rrnr r rr@szBaseFilter.__init__cCst‚dSr)ÚNotImplementedErrorrar r rÚ_matchCszBaseFilter._matchN)r$r%r&rrpr r r rrm?srmcsJeZdZd‡fdd„ Zedd„ƒZdd„Zd d „Zd d „Zd d„Z ‡Z S)ÚFilterNFcs2tƒ |¡||_t|ƒ|_||_||_||_dSr)ÚsuperrrnrlÚ_filename_patternr>Ú all_framesrb)rrnÚfilename_patternr>rtrb©Ú __class__r rrHs   zFilter.__init__cCs|jSr)rsrr r rruQszFilter.filename_patterncCs6t|ƒ}t ||j¡sdS|jdkr(dS||jkSdS)NFT)rlÚfnmatchrsr>©rr;r>r r rÚ_match_frame_implUs  zFilter._match_frame_implcCs| ||¡|j ASr)rzrnryr r rÚ _match_frame^szFilter._match_framecsHˆjr,t‡fdd„|Dƒƒr"ˆjSˆj Sn|d\}}ˆ ||¡SdS)Nc3s|]\}}ˆ ||¡VqdSr)rz)rKr;r>rr rrMcsÿz*Filter._match_traceback..r)rtÚanyrnr{)rrr;r>r rrÚ_match_tracebackas ÿ  zFilter._match_tracebackcCsD|\}}}| |¡}|jdk r@|jr2|o0||jkS|p>||jkS|Sr)r}rbrn)rrLrbr rÚresr r rrpls   z Filter._match)NFN) r$r%r&rrArurzr{r}rpÚ __classcell__r r rvrrqGsÿ    rqcs0eZdZ‡fdd„Zedd„ƒZdd„Z‡ZS)Ú DomainFiltercstƒ |¡||_dSr)rrrÚ_domain)rrnrbrvr rrxs zDomainFilter.__init__cCs|jSr)r�rr r rrb|szDomainFilter.domaincCs|\}}}||jk|j ASr)rbrn)rrLrbr rr r rrp€s zDomainFilter._match)r$r%r&rrArbrprr r rvrr€ws  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)rdrfÚtraceback_limit)rrfrƒr r rrŠs zSnapshot.__init__c Cs*t|dƒ�}t ||tj¡W5QRXdS)z1 Write the snapshot into a file. ÚwbN)ÚopenÚpickleÚdumpZHIGHEST_PROTOCOL)rr;Úfpr r rr‡�s z Snapshot.dumpc Cs,t|dƒ�}t |¡W5QR£SQRXdS)z. Load a snapshot from a file. ÚrbN)r…r†Úload)r;rˆr r rrŠ—s z Snapshot.loadcs@|rt‡fdd„|DƒƒsdS|r.Fc3s|]}| ˆ¡ VqdSrr‹rŒrŽr rrM¥sÿT)r|)rÚinclude_filtersÚexclude_filtersrLr rŽrÚ _filter_traceŸs ÿ ÿzSnapshot._filter_tracecs‚t|tƒstdt|ƒjƒ‚|rjg‰g‰|D] }|jrBˆ |¡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‘rJ©r�r�rr rÚ »s þÿz*Snapshot.filter_traces..) rNrÚ TypeErrorÚtyper$rnr0rfreÚcopyr‚rƒ)rÚfiltersr�Z new_tracesr r’rÚ filter_tracesªs ÿ   zSnapshot.filter_tracesc CsÜ|dkrtd|fƒ‚|r.|dkr.td|ƒ‚i}i}|�s|jjD]Æ}|\}}}z ||} WnZtk r¸|dkr||} n(|dkr’|dd…} n|dddff} t| ƒ} | ||<YnXz(|| } | j|7_| jd7_WqDtk �rt| |dƒ|| <YqDXqDnÊ|jjD]À}|\}}}|D]ª} z || } WnFtk �r~|dk�r\| f} n| ddff} t| ƒ} | || <YnXz(|| } | j|7_| jd7_Wn&tk �rÎt| |dƒ|| <YnX�q(�q|S) N)rr;r>zunknown key_type: %r)r>r;z/cumulative mode cannot by used with key type %rrr>r=r)Ú ValueErrorrfreÚKeyErrorrBr rr) rÚkey_typeÚ cumulativeZstatsZ tracebacksrLrbr Ztrace_tracebackrrGr4r:r r rÚ _group_byÃsZ ÿ       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œZgroupedr3r r rr3ös  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�r5r£r)r")rZ old_snapshotr›rœr2r1r3r r rÚ compare_tos    zSnapshot.compare_toN)F)F) r$r%r&r'rr‡Ú staticmethodrŠr‘r˜r�r3r¤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‚)rfrƒr r rÚ take_snapshot s r¨)Zcollections.abcrrÚ functoolsrrxrUZos.pathrhr†Z _tracemallocrrrrr)r5r6rBr]r^rdrlrmrqr€r‚r¨r r r rÚs2 &0"?%0