
    RhF                     \   d dl mZmZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
 d dl
mZmZ d Z G d d      Z G d	 d
      Zd Ze G d d             Ze G d de             Zd Z G d d      Z G d de      Zd Z G d d      Z G d de      Z G d de      Z G d d      Zd Zy)    )SequenceIterable)total_orderingN)*)_get_object_traceback_get_tracesc                     dD ]U  }t        |       dk  r|dk7  r|r	d| |fz  c S d| |fz  c S t        |       dk  s|dk(  r|r	d| |fz  c S d	| |fz  c S | d
z  } W y )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.12/tracemalloc.py_format_sizer      s    1 t9s?ts{!T4L00 D$<//t9y DEM!T4L00 D$<//    c                   8    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
y	)
	StatisticzS
    Statistic difference on memory allocations between two Snapshot instance.
    	tracebackr   countc                 .    || _         || _        || _        y Nr   )selfr   r   r   s       r   __init__zStatistic.__init__%   s    "	
r   c                 Z    t        | j                  | j                  | j                  f      S r   )hashr   r   r   r   s    r   __hash__zStatistic.__hash__*   s     T^^TYY

;<<r   c                     t        |t              st        S | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S r   )
isinstancer   NotImplementedr   r   r   r   others     r   __eq__zStatistic.__eq__-   sQ    %+!!%//1 .II+.JJ%++-	/r   c                     d| j                   t        | j                  d      | j                  fz  }| j                  r+| j                  | j                  z  }|dt        |d      z  z  }|S )Nz%s: size=%s, count=%iF, average=%s)r   r   r   r   r   textaverages      r   __str__zStatistic.__str__4   sc    'NN E2JJ   ::ii$**,GN\'5%AAADr   c                 N    d| j                   | j                  | j                  fz  S )Nz)<Statistic traceback=%r size=%i count=%i>r   r"   s    r   __repr__zStatistic.__repr__>   s%    ;>>499djj9: 	;r   c                 H    | j                   | j                  | j                  fS r   )r   r   r   r"   s    r   	_sort_keyzStatistic._sort_keyB   s    		4::t~~66r   N__name__
__module____qualname____doc__	__slots__r   r#   r)   r/   r1   r3    r   r   r   r      s,     /I
=/;7r   r   c                   8    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
y	)
StatisticDiffzd
    Statistic difference on memory allocations between an old and a new
    Snapshot instance.
    r   r   	size_diffr   
count_diffc                 J    || _         || _        || _        || _        || _        y r   r=   )r   r   r   r>   r   r?   s         r   r   zStatisticDiff.__init__M   s%    "	"
$r   c                     t        | j                  | j                  | j                  | j                  | j
                  f      S r   )r!   r   r   r>   r   r?   r"   s    r   r#   zStatisticDiff.__hash__T   s3    T^^TYYZZ2 3 	3r   c                 8   t        |t              st        S | j                  |j                  k(  xrj | j                  |j                  k(  xrO | j
                  |j
                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )r%   r<   r&   r   r   r>   r   r?   r'   s     r   r)   zStatisticDiff.__eq__X   s    %/!!%//1 8II+8NNeoo58 JJ%++-8 OOu'7'77		9r   c                    d| j                   t        | j                  d      t        | j                  d      | j                  | j
                  fz  }| j                  r+| j                  | j                  z  }|dt        |d      z  z  }|S )Nz %s: size=%s (%s), count=%i (%+i)FTr+   )r   r   r   r>   r   r?   r,   s      r   r/   zStatisticDiff.__str__a   sx    2>>		515::??	$$ ::ii$**,GN\'5%AAADr   c                 z    d| j                   | j                  | j                  | j                  | j                  fz  S )Nz9<StatisticDiff traceback=%r size=%i (%+i) count=%i (%+i)>r=   r"   s    r   r1   zStatisticDiff.__repr__m   s4    K>>499dnn::t00 	1r   c                     t        | j                        | j                  t        | j                        | j                  | j
                  fS r   )r   r>   r   r?   r   r   r"   s    r   r3   zStatisticDiff._sort_keyr   s7    DNN#TYYDOO$djj  	 r   Nr4   r:   r   r   r<   r<   F   s-     JI%39
1
 r   r<   c           	      2   g }|j                         D ]  \  }}| j                  |d       }|Rt        ||j                  |j                  |j                  z
  |j                  |j                  |j                  z
        }n7t        ||j                  |j                  |j                  |j                        }|j                  |        | j                         D ];  \  }}t        |d|j                   d|j                         }|j                  |       = |S Nr   )itemspopr<   r   r   append)	old_group	new_group
statisticsr   statpreviouss         r   _compare_grouped_statsrP   x   s    J$??, 
 	4==D1 !%DII,E!%TZZ(..-HJD !!%DII!%TZZ9D 	$
  %??,  	4YDII:q4::+F$  r   c                   X    e Zd ZdZdZd Zed        Zed        Zd Z	d Z
d Zd	 Zd
 Zy)Framez
    Frame of a traceback.
    _framec                     || _         y r   rS   r   frames     r   r   zFrame.__init__   s	    r   c                      | j                   d   S rG   rS   r"   s    r   filenamezFrame.filename       {{1~r   c                      | j                   d   S N   rS   r"   s    r   linenozFrame.lineno   rZ   r   c                 `    t        |t              st        S | j                  |j                  k(  S r   r%   rR   r&   rT   r'   s     r   r)   zFrame.__eq__   %    %'!!u||+,r   c                 `    t        |t              st        S | j                  |j                  k  S r   r`   r'   s     r   __lt__zFrame.__lt__   s%    %'!!ell*+r   c                 ,    t        | j                        S r   )r!   rT   r"   s    r   r#   zFrame.__hash__       DKK  r   c                 8    | j                   d| j                  S )N:rY   r^   r"   s    r   r/   zFrame.__str__   s    --55r   c                 <    d| j                   d| j                  dS )Nz<Frame filename=z lineno=>rh   r"   s    r   r1   zFrame.__repr__   s    26--MMr   N)r5   r6   r7   r8   r9   r   propertyrY   r^   r)   rc   r#   r/   r1   r:   r   r   rR   rR      sU     I    -
,
!6Nr   rR   c                   d    e Zd ZdZdZddZed        Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd ZddZy)	Tracebackz`
    Sequence of Frame instances sorted from the oldest frame
    to the most recent frame.
    )_frames_total_nframeNc                 n    t        j                  |        t        t        |            | _        || _        y r   )r   r   tuplereversedrn   ro   )r   framestotal_nframes      r   r   zTraceback.__init__   s+    $
 Xf-.)r   c                     | j                   S r   )ro   r"   s    r   rt   zTraceback.total_nframe   s    !!!r   c                 ,    t        | j                        S r   )lenrn   r"   s    r   __len__zTraceback.__len__       4<<  r   c                     t        |t              rt        d | j                  |   D              S t	        | j                  |         S )Nc              3   2   K   | ]  }t        |        y wr   )rR   .0traces     r   	<genexpr>z(Traceback.__getitem__.<locals>.<genexpr>        G%uG   )r%   slicerq   rn   rR   r   indexs     r   __getitem__zTraceback.__getitem__   :    eU#G4<<3FGGGe,--r   c                 2    |j                   | j                  v S r   )rT   rn   rV   s     r   __contains__zTraceback.__contains__       ||t||++r   c                 ,    t        | j                        S r   )r!   rn   r"   s    r   r#   zTraceback.__hash__   s    DLL!!r   c                 `    t        |t              st        S | j                  |j                  k(  S r   r%   rm   r&   rn   r'   s     r   r)   zTraceback.__eq__   s%    %+!!-.r   c                 `    t        |t              st        S | j                  |j                  k  S r   r   r'   s     r   rc   zTraceback.__lt__   s%    %+!!u}},-r   c                     t        | d         S rG   )strr"   s    r   r/   zTraceback.__str__   s    47|r   c                 n    dt        |        }| j                  |dz  }|S |d| j                   dz  }|S )Nz<Traceback rj   z total_nframe=)rq   ro   rt   )r   ss     r   r1   zTraceback.__repr__   sO    %+'%HA  >$"3"3!4A66Ar   c                 R   g }||dkD  r| | d  }n| d | }n| }|rt        |      }|D ]|  }|j                  d|j                  d|j                         t	        j
                  |j                  |j                        j                         }|si|j                  d|z         ~ |S )Nr   z  File "z", line z    %s)rr   rJ   rY   r^   	linecachegetlinestrip)r   limitmost_recent_firstlinesframe_slicerW   lines          r   formatzTraceback.format   s    qy"E67m"6ElK";/K  	.ELL!NNELL: ;$$U^^U\\BHHJDX_-	. r   r   )NF)r5   r6   r7   r8   r9   r   rk   rt   rx   r   r   r#   r)   rc   r/   r1   r   r:   r   r   rm   rm      sT     -I* " "!.,"/
.
r   rm   c                 4    t        |       }|t        |      S y)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   rm   )objrs   s     r   get_object_tracebackr     s"     #3'F  r   c                   b    e Zd ZdZdZd Zed        Zed        Zed        Z	d Z
d Zd	 Zd
 Zy)Tracez"
    Trace of a memory block.
    _tracec                     || _         y r   r   r   r~   s     r   r   zTrace.__init__  s     r   c                      | j                   d   S rG   r   r"   s    r   domainzTrace.domain  rZ   r   c                      | j                   d   S r\   r   r"   s    r   r   z
Trace.size  rZ   r   c                 ,    t        | j                  dd   S )N   )rm   r   r"   s    r   r   zTrace.traceback#  s    $++ab/**r   c                 `    t        |t              st        S | j                  |j                  k(  S r   )r%   r   r&   r   r'   s     r   r)   zTrace.__eq__'  ra   r   c                 ,    t        | j                        S r   )r!   r   r"   s    r   r#   zTrace.__hash__,  re   r   c                 L    | j                   dt        | j                  d      S )Nz: F)r   r   r   r"   s    r   r/   zTrace.__str__/  s    >><		5+IJJr   c                 j    d| j                   dt        | j                  d      d| j                  dS )Nz<Trace domain=z size=Fz, traceback=rj   )r   r   r   r   r"   s    r   r1   zTrace.__repr__2  s(    ;;TYY >P 	Qr   N)r5   r6   r7   r8   r9   r   rk   r   r   r   r)   r#   r/   r1   r:   r   r   r   r     se     I
     + +-
!KQr   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)_Tracesc                 <    t        j                  |        || _        y r   )r   r   _traces)r   tracess     r   r   z_Traces.__init__8  s    $r   c                 ,    t        | j                        S r   )rw   r   r"   s    r   rx   z_Traces.__len__=  ry   r   c                     t        |t              rt        d | j                  |   D              S t	        | j                  |         S )Nc              3   2   K   | ]  }t        |        y wr   )r   r|   s     r   r   z&_Traces.__getitem__.<locals>.<genexpr>B  r   r   )r%   r   rq   r   r   r   s     r   r   z_Traces.__getitem__@  r   r   c                 2    |j                   | j                  v S r   )r   r   r   s     r   r   z_Traces.__contains__F  r   r   c                 `    t        |t              st        S | j                  |j                  k(  S r   )r%   r   r&   r   r'   s     r   r)   z_Traces.__eq__I  s%    %)!!-.r   c                     dt        |       z  S )Nz<Traces len=%s>)rw   r"   s    r   r1   z_Traces.__repr__N  s     3t9,,r   N)	r5   r6   r7   r   rx   r   r   r)   r1   r:   r   r   r   r   7  s     
!.,/
-r   r   c                 p    t         j                  j                  |       } | j                  d      r| d d } | S )Nz.pyc)ospathnormcaseendswith)rY   s    r   _normalize_filenamer   R  s4    ww)H CR=Or   c                       e Zd Zd Zd Zy)
BaseFilterc                     || _         y r   )	inclusive)r   r   s     r   r   zBaseFilter.__init__Z  s	    "r   c                     t         r   )NotImplementedErrorr   s     r   _matchzBaseFilter._match]  s    !!r   N)r5   r6   r7   r   r   r:   r   r   r   r   Y  s    #"r   r   c                   J     e Zd Z	 d fd	Zed        Zd Zd Zd Zd Z	 xZ
S )Filterc                 |    t         |   |       || _        t        |      | _        || _        || _        || _        y r   )superr   r   r   _filename_patternr^   
all_framesr   )r   r   filename_patternr^   r   r   	__class__s         r   r   zFilter.__init__b  s:    #"!45E!F$r   c                     | j                   S r   )r   r"   s    r   r   zFilter.filename_patternk  s    %%%r   c                     t        |      }t        j                  || j                        sy| j                  y|| j                  k(  S )NFT)r   fnmatchr   r^   r   rY   r^   s      r   _match_frame_implzFilter._match_frame_implo  s?    &x0x)?)?@;;dkk)*r   c                 B    | j                  ||      | j                   z  S r   )r   r   r   s      r   _match_framezFilter._match_framex  s!    %%h7t~~;MNNr   c                       j                   r-t         fd|D              r j                  S  j                   S |d   \  }} j                  ||      S )Nc              3   H   K   | ]  \  }}j                  ||        y wr   )r   )r}   rY   r^   r   s      r   r   z*Filter._match_traceback.<locals>.<genexpr>}  s*      6'x ))(F; 6s   "r   )r   anyr   r   )r   r   rY   r^   s   `   r   _match_tracebackzFilter._match_traceback{  sW    ?? 6+46 6~~% NN*+(|Hf$$Xv66r   c                     |\  }}}}| j                  |      }| j                  2| j                  r|xr || j                  k(  S |xs || j                  k7  S |S r   )r   r   r   )r   r~   r   r   r   rt   ress          r   r   zFilter._match  s^    05-i##I.;;"~~6$++ 565v45
r   )NFN)r5   r6   r7   r   rk   r   r   r   r   r   __classcell__r   s   @r   r   r   a  s4    7; & &+O	7r   r   c                   4     e Zd Z fdZed        Zd Z xZS )DomainFilterc                 2    t         |   |       || _        y r   )r   r   _domain)r   r   r   r   s      r   r   zDomainFilter.__init__  s    #r   c                     | j                   S r   )r   r"   s    r   r   zDomainFilter.domain  s    ||r   c                 J    |\  }}}}|| j                   k(  | j                   z  S r   )r   r   )r   r~   r   r   r   rt   s         r   r   zDomainFilter._match  s+    05-i$++%dnn*<==r   )r5   r6   r7   r   rk   r   r   r   r   s   @r   r   r     s!      >r   r   c                   N    e Zd ZdZd Zd Zed        Zd Zd Z	d Z
ddZdd	Zy
)SnapshotzB
    Snapshot of traces of memory blocks allocated by Python.
    c                 2    t        |      | _        || _        y r   )r   r   traceback_limit)r   r   r   s      r   r   zSnapshot.__init__  s     fo.r   c                     t        |d      5 }t        j                  | |t        j                         ddd       y# 1 sw Y   yxY w)z1
        Write the snapshot into a file.
        wbN)openpickledumpHIGHEST_PROTOCOL)r   rY   fps      r   r   zSnapshot.dump  s;     (D! 	;RKKb&"9"9:	; 	; 	;s	   &<Ac                 p    t        | d      5 }t        j                  |      cddd       S # 1 sw Y   yxY w)z.
        Load a snapshot from a file.
        rbN)r   r   load)rY   r   s     r   r   zSnapshot.load  s0    
 (D! 	#R;;r?	# 	# 	#s   ,5c                 b    |rt        fd|D              sy|rt        fd|D              ryy)Nc              3   @   K   | ]  }|j                          y wr   r   r}   trace_filterr~   s     r   r   z)Snapshot._filter_trace.<locals>.<genexpr>  s$      <' $**51 <s   Fc              3   B   K   | ]  }|j                           y wr   r   r   s     r   r   z)Snapshot._filter_trace.<locals>.<genexpr>  s'      8# $**511 8s   T)r   )r   include_filtersexclude_filtersr~   s      `r   _filter_tracezSnapshot._filter_trace  s<     <+:< < 8'68 8r   c                    t        |t              s!t        dt        |      j                  z        |rqg }g }|D ]1  }|j
                  r|j                  |       !|j                  |       3 | j                  j                  D cg c]  }| j                  |||      r| }}n$| j                  j                  j                         }t        || j                        S c c}w )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typer5   r   rJ   r   r   r   copyr   r   )r   filtersr   r   r   r~   
new_tracess          r   filter_traceszSnapshot.filter_traces  s     '8,G"7m445 6 6 O O ' 9))#**<8#**<8	9
 .2[[-@-@ 8E!//0?057   8J 8
 ,,113J
D$8$8998s   Cc                 &   |dvrt        d|      |r|dvrt        d|z        i }i }|sZ| j                  j                  D ]?  }|\  }}}}		 ||   }
	 ||
   }|xj
                  |z  c_        |xj                  dz  c_        A |S | j                  j                  D ]F  }|\  }}}}	|D ]8  }	 ||   }
	 ||
   }|xj
                  |z  c_        |xj                  dz  c_        : H |S # t        $ r1 |dk(  r|}n|dk(  r|d d }n|d   d   dff}t	        |      }
|
||<   Y w xY w# t        $ r t        |
|d      ||
<   Y w xY w# t        $ r$ |dk(  r|f}n|d   dff}t	        |      }
|
||<   Y w xY w# t        $ r t        |
|d      ||
<   Y w xY w)	N)r   rY   r^   zunknown key_type: )r^   rY   z/cumulative mode cannot by used with key type %rr   r^   r]   r   )
ValueErrorr   r   KeyErrorrm   r   r   r   )r   key_type
cumulativestats
tracebacksr~   r   r   trace_tracebackrt   r   rs   rN   rW   s                 r   	_group_byzSnapshot._group_by  s    >>xABB(*@@ 02:; < < 
,, E>C;o|
< *? ;IE +DII%IJJ!OJ!EN % ,, I>C;o|, IE6$.u$5	I$Y/		T)	

a
II$ G   <;.!0!X-!0!!4#21#5a#8!"<!> )& 1I2;J/<   E'0D!'DE)$E $ 6#x/&+XF',Qxm%5F$-f$5	,5
5)6 $ I+4Ya+Hi(IsH   C(/D%-E3/E4(7D"!D"%E E*E10E14FFc                     | j                  ||      }t        |j                               }|j                  dt        j
                         |S )zd
        Group statistics by key_type. Return a sorted list of Statistic
        instances.
        Treversekey)r
  listvaluessortr   r3   )r   r  r  groupedrM   s        r   rM   zSnapshot.statistics  sA    
 ..:6'..*+
)*=*=>r   c                     | j                  ||      }|j                  ||      }t        ||      }|j                  dt        j                         |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
  rP   r  r<   r3   )r   old_snapshotr  r  rL   rK   rM   s          r   
compare_tozSnapshot.compare_to  sN     NN8Z8	 **8Z@	+IyA
-*A*ABr   N)F)r5   r6   r7   r8   r   r   staticmethodr   r   r  r
  rM   r  r:   r   r   r   r     s?    /; # #	:21f
r   r   c                  l    t               st        d      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RuntimeErrorr   get_traceback_limitr   )r   r   s     r   take_snapshotr  '  s7     < < = 	=]F)+OFO,,r   )collections.abcr   r   	functoolsr   r   r   os.pathr   r   _tracemallocr   r   r   r   r<   rP   rR   rm   r   r   r   r   r   r   r   r   r  r:   r   r   <module>r      s    . $      ;"%7 %7P/  / d( #N #N #NL J J JZ$Q $QN-h -6" "-Z -`>: >E EP	-r   