
    F\hF                     \   S SK JrJr  S SKJr  S SKrS SKrS SKrS SK	r	S SK
7  S SK
JrJr  S r " S S5      r " S	 S
5      rS r\ " S S5      5       r\ " S S\5      5       rS r " S S5      r " S S\5      rS r " S S5      r " S S\5      r " S S\5      r " S S5      rS rg)    )SequenceIterable)total_orderingN)*)_get_object_traceback_get_tracesc                     S H`  n[        U 5      S:  a  US:w  a  U(       a  SX4-  s  $ SX4-  s  $ [        U 5      S:  d  US:X  a  U(       a  SX4-  s  $ S	X4-  s  $ U S
-  n Mb     g )N)BKiBMiBGiBTiBd   r
   z%+.1f %sz%.1f %si (  r   z%+.0f %sz%.0f %si   )abs)sizesignunits      "/usr/lib/python3.13/tracemalloc.py_format_sizer      sr    1t9s?ts{!TL00 D<//t9y DEM!TL00 D<// 2    c                   @    \ rS rSrSrSrS rS rS rS r	S r
S	 rS
rg)	Statistic   zK
Statistic difference on memory allocations between two Snapshot instance.
	tracebackr   countc                 (    Xl         X l        X0l        g Nr   )selfr   r   r   s       r   __init__Statistic.__init__%   s    "	
r   c                 Z    [        U R                  U R                  U R                  45      $ r   )hashr   r   r   r   s    r   __hash__Statistic.__hash__*   s     T^^TYY

;<<r   c                     [        U[        5      (       d  [        $ U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ r   )
isinstancer   NotImplementedr   r   r   r   others     r   __eq__Statistic.__eq__-   sT    %++!!%//1 .II+.JJ%++-	/r   c                     SU R                   [        U R                  S5      U R                  4-  nU R                  (       a+  U R                  U R                  -  nUS[        US5      -  -  nU$ )Nz%s: size=%s, count=%iF, average=%s)r   r   r   r   r   textaverages      r   __str__Statistic.__str__4   sc    'NN E2JJ   ::ii$**,GN\'5%AAADr   c                 N    SU R                   U R                  U R                  4-  $ )Nz)<Statistic traceback=%r size=%i count=%i>r   r$   s    r   __repr__Statistic.__repr__>   s%    ;>>499djj9: 	;r   c                 H    U R                   U R                  U R                  4$ r   )r   r   r   r$   s    r   	_sort_keyStatistic._sort_keyB   s    		4::t~~66r   )r   r   r   N__name__
__module____qualname____firstlineno____doc__	__slots__r    r%   r,   r3   r6   r9   __static_attributes__ r   r   r   r      s,     /I
=/;7r   r   c                   @    \ rS rSrSrSrS rS rS rS r	S r
S	 rS
rg)StatisticDiffF   zX
Statistic difference on memory allocations between an old and a new
Snapshot instance.
r   r   	size_diffr   
count_diffc                 @    Xl         X l        X0l        X@l        XPl        g r   rG   )r   r   r   rH   r   rI   s         r   r    StatisticDiff.__init__M   s    "	"
$r   c                     [        U R                  U R                  U R                  U R                  U R
                  45      $ r   )r#   r   r   rH   r   rI   r$   s    r   r%   StatisticDiff.__hash__T   s3    T^^TYYZZ2 3 	3r   c                 j   [        U[        5      (       d  [        $ U R                  UR                  :H  =(       ay    U R                  UR                  :H  =(       aY    U R
                  UR
                  :H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ r   )r(   rE   r)   r   r   rH   r   rI   r*   s     r   r,   StatisticDiff.__eq__X   s    %//!!%//1 8II+8NNeoo58 JJ%++-8 OOu'7'77		9r   c                    SU R                   [        U R                  S5      [        U R                  S5      U R                  U R
                  4-  nU R                  (       a+  U R                  U R                  -  nUS[        US5      -  -  nU$ )Nz %s: size=%s (%s), count=%i (%+i)FTr/   )r   r   r   rH   r   rI   r0   s      r   r3   StatisticDiff.__str__a   sx    2>>		515::??	$$ ::ii$**,GN\'5%AAADr   c                 z    SU R                   U R                  U R                  U R                  U R                  4-  $ )Nz9<StatisticDiff traceback=%r size=%i (%+i) count=%i (%+i)>rG   r$   s    r   r6   StatisticDiff.__repr__m   s4    K>>499dnn::t00 	1r   c                     [        U R                  5      U R                  [        U R                  5      U R                  U R
                  4$ r   )r   rH   r   rI   r   r   r$   s    r   r9   StatisticDiff._sort_keyr   s7    DNN#TYYDOO$djj  	 r   )r   rI   r   rH   r   Nr;   rC   r   r   rE   rE   F   s-     JI%39
1
 r   rE   c           	      8   / nUR                  5        H  u  p4U R                  US 5      nUbR  [        UUR                  UR                  UR                  -
  UR                  UR                  UR                  -
  5      nO7[        UUR                  UR                  UR                  UR                  5      nUR                  U5        M     U R                  5        H;  u  p4[        USUR                  * SUR                  * 5      nUR                  U5        M=     U$ Nr   )itemspoprE   r   r   append)	old_group	new_group
statisticsr   statpreviouss         r   _compare_grouped_statsr`   x   s    J$??,	==D1 !%DII,E!%TZZ(..-HJD !!%DII!%TZZ9D 	$ - %??,	YDII:q4::+F$ - r   c                   `    \ rS rSrSrSrS r\S 5       r\S 5       r	S r
S rS	 rS
 rS rSrg)Frame   z
Frame of a traceback.
_framec                     Xl         g r   rd   r   frames     r   r    Frame.__init__   s    r   c                      U R                   S   $ rW   rd   r$   s    r   filenameFrame.filename       {{1~r   c                      U R                   S   $ N   rd   r$   s    r   linenoFrame.lineno   rm   r   c                 j    [        U[        5      (       d  [        $ U R                  UR                  :H  $ r   r(   rb   r)   re   r*   s     r   r,   Frame.__eq__   (    %''!!u||+,r   c                 j    [        U[        5      (       d  [        $ U R                  UR                  :  $ r   rt   r*   s     r   __lt__Frame.__lt__   s(    %''!!ell*+r   c                 ,    [        U R                  5      $ r   )r#   re   r$   s    r   r%   Frame.__hash__       DKK  r   c                 <    U R                   < SU R                  < 3$ )N:rk   rq   r$   s    r   r3   Frame.__str__   s    --55r   c                 @    SU R                   < SU R                  < S3$ )Nz<Frame filename=z lineno=>r   r$   s    r   r6   Frame.__repr__   s    26--MMr   N)r<   r=   r>   r?   r@   rA   r    propertyrk   rq   r,   rx   r%   r3   r6   rB   rC   r   r   rb   rb      sU     I    -
,
!6Nr   rb   c                   p    \ rS rSrSrSrSS jr\S 5       rS r	S r
S	 rS
 rS rS rS rS rSS jrSrg)	Traceback   zT
Sequence of Frame instances sorted from the oldest frame
to the most recent frame.
)_frames_total_nframeNc                 n    [         R                  " U 5        [        [        U5      5      U l        X l        g r   )r   r    tuplereversedr   r   )r   framestotal_nframes      r   r    Traceback.__init__   s)    $
 Xf-.)r   c                     U R                   $ r   )r   r$   s    r   r   Traceback.total_nframe   s    !!!r   c                 ,    [        U R                  5      $ r   )lenr   r$   s    r   __len__Traceback.__len__       4<<  r   c                     [        U[        5      (       a  [        S U R                  U    5       5      $ [	        U R                  U   5      $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr   )rb   .0traces     r   	<genexpr>(Traceback.__getitem__.<locals>.<genexpr>        G3F%u3F   )r(   slicer   r   rb   r   indexs     r   __getitem__Traceback.__getitem__   =    eU##G4<<3FGGGe,--r   c                 4    UR                   U R                  ;   $ r   )re   r   rg   s     r   __contains__Traceback.__contains__       ||t||++r   c                 ,    [        U R                  5      $ r   )r#   r   r$   s    r   r%   Traceback.__hash__   s    DLL!!r   c                 j    [        U[        5      (       d  [        $ U R                  UR                  :H  $ r   r(   r   r)   r   r*   s     r   r,   Traceback.__eq__   s(    %++!!-.r   c                 j    [        U[        5      (       d  [        $ U R                  UR                  :  $ r   r   r*   s     r   rx   Traceback.__lt__   s(    %++!!u}},-r   c                     [        U S   5      $ rW   )strr$   s    r   r3   Traceback.__str__   s    47|r   c                 p    S[        U 5       3nU R                  c  US-  nU$ USU R                   S3-  nU$ )Nz<Traceback r   z total_nframe=)r   r   r   )r   ss     r   r6   Traceback.__repr__   sO    %+'%HA  >$"3"3!4A66Ar   c                 t   / nUb  US:  a  X* S  nOU S U nOU nU(       a  [        U5      nU H  nUR                  SUR                  < SUR                  < 35        [        R
                  " UR                  UR                  5      R                  5       nU(       d  Mr  UR                  SU-  5        M     U$ )Nr   z  File "z", line z    %s)r   rZ   rk   rq   	linecachegetlinestrip)r   limitmost_recent_firstlinesframe_slicerh   lines          r   formatTraceback.format   s    qy"67m"6ElK";/K ELL!NNELL: ;$$U^^U\\BHHJDtX_- ! r   r   )NF)r<   r=   r>   r?   r@   rA   r    r   r   r   r   r   r%   r,   rx   r3   r6   r   rB   rC   r   r   r   r      sT     -I* " "!.,"/
.
r   r   c                 6    [        U 5      nUb  [        U5      $ g)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)r   r   )objr   s     r   get_object_tracebackr     s"     #3'F  r   c                   j    \ rS rSrSrSrS r\S 5       r\S 5       r	\S 5       r
S rS	 rS
 rS rSrg)Tracei  z
Trace of a memory block.
_tracec                     Xl         g r   r   r   r   s     r   r    Trace.__init__  s	     r   c                      U R                   S   $ rW   r   r$   s    r   domainTrace.domain  rm   r   c                      U R                   S   $ ro   r   r$   s    r   r   
Trace.size  rm   r   c                 ,    [        U R                  SS  6 $ )N   )r   r   r$   s    r   r   Trace.traceback#  s    $++ab/**r   c                 j    [        U[        5      (       d  [        $ U R                  UR                  :H  $ r   )r(   r   r)   r   r*   s     r   r,   Trace.__eq__'  rv   r   c                 ,    [        U R                  5      $ r   )r#   r   r$   s    r   r%   Trace.__hash__,  r|   r   c                 P    U R                   < S[        U R                  S5      < 3$ )Nz: F)r   r   r   r$   s    r   r3   Trace.__str__/  s    >><		5+IJJr   c                 p    SU R                   < S[        U R                  S5      < SU R                  < S3$ )Nz<Trace domain=z size=Fz, traceback=r   )r   r   r   r   r$   s    r   r6   Trace.__repr__2  s(    ;;TYY >P 	Qr   N)r<   r=   r>   r?   r@   rA   r    r   r   r   r   r,   r%   r3   r6   rB   rC   r   r   r   r     se     I
     + +-
!KQr   r   c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
_Tracesi7  c                 <    [         R                  " U 5        Xl        g r   )r   r    _traces)r   tracess     r   r    _Traces.__init__8  s    $r   c                 ,    [        U R                  5      $ r   )r   r   r$   s    r   r   _Traces.__len__=  r   r   c                     [        U[        5      (       a  [        S U R                  U    5       5      $ [	        U R                  U   5      $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr   )r   r   s     r   r   &_Traces.__getitem__.<locals>.<genexpr>B  r   r   )r(   r   r   r   r   r   s     r   r   _Traces.__getitem__@  r   r   c                 4    UR                   U R                  ;   $ r   )r   r   r   s     r   r   _Traces.__contains__F  r   r   c                 j    [        U[        5      (       d  [        $ U R                  UR                  :H  $ r   )r(   r   r)   r   r*   s     r   r,   _Traces.__eq__I  s(    %))!!-.r   c                     S[        U 5      -  $ )Nz<Traces len=%s>)r   r$   s    r   r6   _Traces.__repr__N  s     3t9,,r   )r   N)r<   r=   r>   r?   r    r   r   r   r,   r6   rB   rC   r   r   r   r   7  s     
!.,/
-r   r   c                 z    [         R                  R                  U 5      n U R                  S5      (       a  U S S n U $ )Nz.pyc)ospathnormcaseendswith)rk   s    r   _normalize_filenamer   R  s7    ww)H  CR=Or   c                        \ rS rSrS rS rSrg)
BaseFilteriY  c                     Xl         g r   	inclusive)r   r   s     r   r    BaseFilter.__init__Z  s    "r   c                     [         er   )NotImplementedErrorr   s     r   _matchBaseFilter._match]  s    !!r   r   N)r<   r=   r>   r?   r    r   rB   rC   r   r   r   r   Y  s    #"r   r   c                   V   ^  \ rS rSr S	U 4S jjr\S 5       rS rS rS r	S r
SrU =r$ )
Filteria  c                 t   > [         TU ]  U5        Xl        [        U5      U l        X0l        X@l        XPl        g r   )superr    r   r   _filename_patternrq   
all_framesr   )r   r   filename_patternrq   r  r   	__class__s         r   r    Filter.__init__b  s2    #"!45E!F$r   c                     U R                   $ r   )r  r$   s    r   r  Filter.filename_patternk  s    %%%r   c                     [        U5      n[        R                  " XR                  5      (       d  gU R                  c  gX R                  :H  $ )NFT)r   fnmatchr  rq   r   rk   rq   s      r   _match_frame_implFilter._match_frame_implo  s>    &x0x)?)?@@;;kk)*r   c                 H    U R                  X5      U R                  (       + -  $ r   )r  r   r  s      r   _match_frameFilter._match_framex  s    %%h7t~~;MNNr   c                    ^  T R                   (       a7  [        U 4S jU 5       5      (       a  T R                  $ T R                  (       + $ US   u  p#T R                  X#5      $ )Nc              3   J   >#    U  H  u  pTR                  X5      v   M     g 7fr   )r  )r   rk   rq   r   s      r   r   *Filter._match_traceback.<locals>.<genexpr>}  s)      6+4'x ))(;;+4s    #r   )r  anyr   r  )r   r   rk   rq   s   `   r   _match_tracebackFilter._match_traceback{  sX    ?? 6+46 6 6~~% NN*+(|H$$X66r   c                     Uu  p#pEU R                  U5      nU R                  b?  U R                  (       a  U=(       a    X R                  :H  $ U=(       d    X R                  :g  $ U$ r   )r  r   r   )r   r   r   r   r   r   ress          r   r   Filter._match  sV    05-i##I.;;"~~6++ 565v45
r   )r  r  r   r   rq   )NFN)r<   r=   r>   r?   r    r   r  r  r  r  r   rB   __classcell__r  s   @r   r   r   a  s9    7; & &+O	7 r   r   c                   >   ^  \ rS rSrU 4S jr\S 5       rS rSrU =r	$ )DomainFilteri  c                 0   > [         TU ]  U5        X l        g r   )r  r    _domain)r   r   r   r  s      r   r    DomainFilter.__init__  s    #r   c                     U R                   $ r   r   r$   s    r   r   DomainFilter.domain  s    ||r   c                 L    Uu  p#pEX R                   :H  U R                  (       + -  $ r   )r   r   )r   r   r   r   r   r   s         r   r   DomainFilter._match  s%    05-i++%dnn*<==r   r#  )
r<   r=   r>   r?   r    r   r   r   rB   r  r  s   @r   r  r    s&      > >r   r  c                   Z    \ rS rSrSrS rS r\S 5       rS r	S r
S rSS	 jrSS
 jrSrg)Snapshoti  z:
Snapshot of traces of memory blocks allocated by Python.
c                 0    [        U5      U l        X l        g r   )r   r   traceback_limit)r   r   r*  s      r   r    Snapshot.__init__  s     fo.r   c                     [        US5       n[        R                  " X[        R                  5        SSS5        g! , (       d  f       g= f)z!
Write the snapshot into a file.
wbN)openpickledumpHIGHEST_PROTOCOL)r   rk   fps      r   r0  Snapshot.dump  s0     (D!RKK&"9"9: "!!s	   &<
A
c                 |    [        U S5       n[        R                  " U5      sSSS5        $ ! , (       d  f       g= f)z
Load a snapshot from a file.
rbN)r.  r/  load)rk   r2  s     r   r6  Snapshot.load  s'    
 (D!R;;r? "!!s   -
;c                    ^ U(       a  [        U4S jU 5       5      (       d  gU(       a  [        U4S jU 5       5      (       a  gg)Nc              3   F   >#    U  H  nUR                  T5      v   M     g 7fr   r   r   trace_filterr   s     r   r   )Snapshot._filter_trace.<locals>.<genexpr>  s&      <+:< $**511+:s   !Fc              3   P   >#    U  H  nUR                  T5      (       + v   M     g 7fr   r:  r;  s     r   r   r=    s)      8'6| $**5111'6s   #&T)r  )r   include_filtersexclude_filtersr   s      `r   _filter_traceSnapshot._filter_trace  sF     <+:< < < 8'68 8 8r   c                    [        U[        5      (       d!  [        S[        U5      R                  -  5      eU(       a  / n/ nU H8  nUR
                  (       a  UR                  U5        M'  UR                  U5        M:     U R                  R                   Vs/ s H  nU R                  UUU5      (       d  M  UPM!     nnO$U R                  R                  R                  5       n[        X`R                  5      $ s  snf )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 %s)r(   r   	TypeErrortyper<   r   rZ   r   r   rA  copyr(  r*  )r   filtersr?  r@  r<  r   
new_tracess          r   filter_tracesSnapshot.filter_traces  s     '8,,G"7m445 6 6 O O '))#**<8#**<8	 !(
 .2[[-@-@ 8-@E!//0?057  -@J 8J
 ,,113J
$8$8998s   C:8C:c                 F   US;  a  [        SU< 35      eU(       a  US;  a  [        SU-  5      e0 n0 nU(       dX  U R                  R                   H<  nUu  pgp XH   n
 X:   nU=R
                  U-  sl        U=R                  S-  sl        M>     U$ U R                  R                   HE  nUu  pgpU H7  n XM   n
 X:   nU=R
                  U-  sl        U=R                  S-  sl        M9     MG     U$ ! [         a2    US:X  a  UnOUS:X  a  US S nOUS   S   S44n[	        U5      n
XU'    Nf = f! [         a    [        XS5      X:'    M  f = f! [         a$    US:X  a  U4nOUS   S44n[	        U5      n
XU'    Nf = f! [         a    [        XS5      X:'    M  f = f)	N)r   rk   rq   zunknown key_type: )rq   rk   z/cumulative mode cannot by used with key type %rr   rq   rp   r   )
ValueErrorr   r   KeyErrorr   r   r   r   )r   key_type
cumulativestats
tracebacksr   r   r   trace_tracebackr   r   r   r^   rh   s                 r   	_group_bySnapshot._group_by  s   >>xABB(*@@ 02:; < < 
,,>C;o
< * ;IE +DII%IJJ!OJ! -N % ,,>C;o,E6$.$5	I$/		T)	

a
 - -$ G   <;.!0!X-!0!!4#21#5a#8!"<!> )& 1I2;/<   E'0!'DE$E $ 6#x/&+XF',Qxm%5F$-f$5	,55)6 $ I+4Ya+H(IsH   C5 .D48E=.F59D10D14EE+F FF F c                     U R                  X5      n[        UR                  5       5      nUR                  S[        R
                  S9  U$ )zL
Group statistics by key_type. Return a sorted list of Statistic
instances.
Treversekey)rS  listvaluessortr   r9   )r   rN  rO  groupedr]   s        r   r]   Snapshot.statistics  s?    
 ..6'..*+
)*=*=>r   c                     U R                  X#5      nUR                  X#5      n[        XT5      nUR                  S[        R                  S9  U$ )z
Compute the differences with an old snapshot old_snapshot. Get
statistics as a sorted list of StatisticDiff instances, grouped by
group_by.
TrV  )rS  r`   r[  rE   r9   )r   old_snapshotrN  rO  r\   r[   r]   s          r   
compare_toSnapshot.compare_to  sH     NN88	 **8@	+IA
-*A*ABr   )r*  r   N)F)r<   r=   r>   r?   r@   r    r0  staticmethodr6  rA  rI  rS  r]   r`  rB   rC   r   r   r(  r(    s?    /; # #	:21f
r   r(  c                  t    [        5       (       d  [        S5      e[        5       n [        5       n[	        X5      $ )zA
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RuntimeErrorr   get_traceback_limitr(  )r   r*  s     r   take_snapshotrg  '  s7     << < = 	=]F)+OF,,r   )collections.abcr   r   	functoolsr   r  r   os.pathr   r/  _tracemallocr   r   r   r   rE   r`   rb   r   r   r   r   r   r   r   r  r(  rg  rC   r   r   <module>rl     s    . $      ;"%7 %7P/  / d( #N #N #NL J J JZ$Q $QN-h -6" "-Z -`>: >E EP	-r   