???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3

  \A                 @   s  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
T d dl
mZmZ dd ZG dd	 d	ZG d
d dZdd ZeG dd dZeG dd deZdd ZG dd dZG dd deZdd ZG dd dZG dd deZG dd deZG d d! d!Zd"d# ZdS )$    )SequenceIterable)total_orderingN)*)_get_object_traceback_get_tracesc             C   sz   xtdD ]l}t | dk r:|dkr:|r.d| |f S d| |f S t | dk sN|dkrj|r^d| |f S d| |f S | d
 } qW d S )NBKiBMiBGiBTiBd   z%+.1f %sz%.1f %s
   i   z%+.0f %sz%.0f %s)r   r	   r
   r   r   i (  )abs)sizeZsignZunit r   #/usr/lib64/python3.6/tracemalloc.py_format_size   s    
r   c               @   s@   e Zd ZdZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )	Statistic	tracebackr   countc             C   s   || _ || _|| _d S )N)r   r   r   )selfr   r   r   r   r   r   __init__%   s    zStatistic.__init__c             C   s   t | j| j| jfS )N)hashr   r   r   )r   r   r   r   __hash__*   s    zStatistic.__hash__c             C   s$   | j |j ko"| j|jko"| j|jkS )N)r   r   r   )r   otherr   r   r   __eq__-   s    zStatistic.__eq__c             C   sB   d| j t| jd| jf }| jr>| j| j }|dt|d 7 }|S )Nz%s: size=%s, count=%iFz, average=%s)r   r   r   r   )r   textaverager   r   r   __str__2   s    

zStatistic.__str__c             C   s   d| j | j| jf S )Nz)<Statistic traceback=%r size=%i count=%i>)r   r   r   )r   r   r   r   __repr__<   s    zStatistic.__repr__c             C   s   | j | j| jfS )N)r   r   r   )r   r   r   r   	_sort_key@   s    zStatistic._sort_keyN)r   r   r   )
__name__
__module____qualname__	__slots__r   r   r   r   r    r!   r   r   r   r   r      s   
r   c               @   s@   e Zd ZdZdd Zdd	 Zd
d Zdd Zdd Zdd Z	dS )StatisticDiffr   r   	size_diffr   
count_diffc             C   s"   || _ || _|| _|| _|| _d S )N)r   r   r'   r   r(   )r   r   r   r'   r   r(   r   r   r   r   K   s
    zStatisticDiff.__init__c             C   s   t | j| j| j| j| jfS )N)r   r   r   r'   r   r(   )r   r   r   r   r   R   s    zStatisticDiff.__hash__c             C   s<   | j |j ko:| j|jko:| j|jko:| j|jko:| j|jkS )N)r   r   r'   r   r(   )r   r   r   r   r   r   V   s
    zStatisticDiff.__eq__c             C   sP   d| j t| jdt| jd| j| jf }| jrL| j| j }|dt|d 7 }|S )Nz %s: size=%s (%s), count=%i (%+i)FTz, average=%s)r   r   r   r'   r   r(   )r   r   r   r   r   r   r   ]   s    


zStatisticDiff.__str__c             C   s   d| j | j| j| j| jf S )Nz9<StatisticDiff traceback=%r size=%i (%+i) count=%i (%+i)>)r   r   r'   r   r(   )r   r   r   r   r    i   s    zStatisticDiff.__repr__c             C   s    t | j| jt | j| j| jfS )N)r   r'   r   r(   r   r   )r   r   r   r   r!   n   s    zStatisticDiff._sort_keyN)r   r   r'   r   r(   )
r"   r#   r$   r%   r   r   r   r   r    r!   r   r   r   r   r&   D   s   r&   c             C   s   g }xp|j  D ]d\}}| j|d }|d k	rPt||j|j|j |j|j|j }nt||j|j|j|j}|j| qW x6| j  D ]*\}}t|d|j d|j }|j| qW |S )Nr   )itemspopr&   r   r   append)	old_group	new_group
statisticsr   statZpreviousr   r   r   _compare_grouped_statst   s    r0   c               @   sX   e Zd ZdZdd Zedd Zedd Zdd	 Zd
d Z	dd Z
dd Zdd ZdS )Frame_framec             C   s
   || _ d S )N)r2   )r   framer   r   r   r      s    zFrame.__init__c             C   s
   | j d S )Nr   )r2   )r   r   r   r   filename   s    zFrame.filenamec             C   s
   | j d S )N   )r2   )r   r   r   r   lineno   s    zFrame.linenoc             C   s   | j |j kS )N)r2   )r   r   r   r   r   r      s    zFrame.__eq__c             C   s   | j |j k S )N)r2   )r   r   r   r   r   __lt__   s    zFrame.__lt__c             C   s
   t | jS )N)r   r2   )r   r   r   r   r      s    zFrame.__hash__c             C   s   d| j | jf S )Nz%s:%s)r4   r6   )r   r   r   r   r      s    zFrame.__str__c             C   s   d| j | jf S )Nz<Frame filename=%r lineno=%r>)r4   r6   )r   r   r   r   r       s    zFrame.__repr__N)r2   )r"   r#   r$   r%   r   propertyr4   r6   r   r7   r   r   r    r   r   r   r   r1      s   r1   c               @   sb   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd ZdddZdS )	Traceback_framesc             C   s   t j|  || _d S )N)r   r   r:   )r   framesr   r   r   r      s    
zTraceback.__init__c             C   s
   t | jS )N)lenr:   )r   r   r   r   __len__   s    zTraceback.__len__c             C   s4   t |tr"tdd | j| D S t| j| S d S )Nc             s   s   | ]}t |V  qd S )N)r1   ).0tracer   r   r   	<genexpr>   s    z(Traceback.__getitem__.<locals>.<genexpr>)
isinstanceslicetupler:   r1   )r   indexr   r   r   __getitem__   s    
zTraceback.__getitem__c             C   s   |j | jkS )N)r2   r:   )r   r3   r   r   r   __contains__   s    zTraceback.__contains__c             C   s
   t | jS )N)r   r:   )r   r   r   r   r      s    zTraceback.__hash__c             C   s   | j |j kS )N)r:   )r   r   r   r   r   r      s    zTraceback.__eq__c             C   s   | j |j k S )N)r:   )r   r   r   r   r   r7      s    zTraceback.__lt__c             C   s   t | d S )Nr   )str)r   r   r   r   r      s    zTraceback.__str__c             C   s   dt | f S )Nz<Traceback %r>)rC   )r   r   r   r   r       s    zTraceback.__repr__Nc             C   sn   g }|d k	r|dk r|S xP| d | D ]@}|j d|j|jf  tj|j|jj }|r&|j d|  q&W |S )Nr   z  File "%s", line %sz    %s)r+   r4   r6   	linecachegetlinestrip)r   limitlinesr3   liner   r   r   format   s    zTraceback.format)r:   )N)r"   r#   r$   r%   r   r=   rE   rF   r   r   r7   r   r    rN   r   r   r   r   r9      s   r9   c             C   s    t | }|d k	rt|S d S d S )N)r   r9   )objr;   r   r   r   get_object_traceback   s    rP   c               @   s\   e Zd ZdZdd Zedd Zedd Zedd	 Zd
d Z	dd Z
dd Zdd ZdS )Trace_tracec             C   s
   || _ d S )N)rR   )r   r?   r   r   r   r      s    zTrace.__init__c             C   s
   | j d S )Nr   )rR   )r   r   r   r   domain   s    zTrace.domainc             C   s
   | j d S )Nr5   )rR   )r   r   r   r   r      s    z
Trace.sizec             C   s   t | jd S )N   )r9   rR   )r   r   r   r   r     s    zTrace.tracebackc             C   s   | j |j kS )N)rR   )r   r   r   r   r   r     s    zTrace.__eq__c             C   s
   t | jS )N)r   rR   )r   r   r   r   r   
  s    zTrace.__hash__c             C   s   d| j t| jdf S )Nz%s: %sF)r   r   r   )r   r   r   r   r     s    zTrace.__str__c             C   s   d| j t| jd| jf S )Nz'<Trace domain=%s size=%s, traceback=%r>F)rS   r   r   r   )r   r   r   r   r      s    zTrace.__repr__N)rR   )r"   r#   r$   r%   r   r8   rS   r   r   r   r   r   r    r   r   r   r   rQ      s   rQ   c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )_Tracesc             C   s   t j|  || _d S )N)r   r   _traces)r   tracesr   r   r   r     s    
z_Traces.__init__c             C   s
   t | jS )N)r<   rV   )r   r   r   r   r=     s    z_Traces.__len__c             C   s4   t |tr"tdd | j| D S t| j| S d S )Nc             s   s   | ]}t |V  qd S )N)rQ   )r>   r?   r   r   r   r@      s    z&_Traces.__getitem__.<locals>.<genexpr>)rA   rB   rC   rV   rQ   )r   rD   r   r   r   rE     s    
z_Traces.__getitem__c             C   s   |j | jkS )N)rR   rV   )r   r?   r   r   r   rF   $  s    z_Traces.__contains__c             C   s   | j |j kS )N)rV   )r   r   r   r   r   r   '  s    z_Traces.__eq__c             C   s   dt |  S )Nz<Traces len=%s>)r<   )r   r   r   r   r    *  s    z_Traces.__repr__N)	r"   r#   r$   r   r=   rE   rF   r   r    r   r   r   r   rU     s   rU   c             C   s&   t jj| } | jdr"| d d } | S )Nz.pycr5   )ospathnormcaseendswith)r4   r   r   r   _normalize_filename.  s    
r]   c               @   s   e Zd Zdd Zdd ZdS )
BaseFilterc             C   s
   || _ d S )N)	inclusive)r   r_   r   r   r   r   6  s    zBaseFilter.__init__c             C   s   t d S )N)NotImplementedError)r   r?   r   r   r   _match9  s    zBaseFilter._matchN)r"   r#   r$   r   ra   r   r   r   r   r^   5  s   r^   c                   sJ   e Zd Zd fdd	Zedd Zdd Zd	d
 Zdd Zdd Z	  Z
S )FilterNFc                s2   t  j| || _t|| _|| _|| _|| _d S )N)superr   r_   r]   _filename_patternr6   
all_framesrS   )r   r_   filename_patternr6   re   rS   )	__class__r   r   r   >  s    
zFilter.__init__c             C   s   | j S )N)rd   )r   r   r   r   rf   G  s    zFilter.filename_patternc             C   s6   t |}tj|| jsdS | jd kr(dS || jkS d S )NFT)r]   fnmatchrd   r6   )r   r4   r6   r   r   r   _match_frame_implK  s    
zFilter._match_frame_implc             C   s   | j ||| j A S )N)ri   r_   )r   r4   r6   r   r   r   _match_frameT  s    zFilter._match_framec                sH    j r,t fdd|D r" jS  j S n|d \}} j||S d S )Nc             3   s   | ]\}} j ||V  qd S )N)ri   )r>   r4   r6   )r   r   r   r@   Y  s   z*Filter._match_traceback.<locals>.<genexpr>r   )re   anyr_   rj   )r   r   r4   r6   r   )r   r   _match_tracebackW  s    

zFilter._match_tracebackc             C   sD   |\}}}| j |}| jd k	r@| jr2|o0|| jkS |p>|| jkS |S )N)rl   rS   r_   )r   r?   rS   r   r   resr   r   r   ra   b  s    


zFilter._match)NFN)r"   r#   r$   r   r8   rf   ri   rj   rl   ra   __classcell__r   r   )rg   r   rb   =  s   	rb   c                   s0   e Zd Z fddZedd Zdd Z  ZS )DomainFilterc                s   t  j| || _d S )N)rc   r   _domain)r   r_   rS   )rg   r   r   r   n  s    zDomainFilter.__init__c             C   s   | j S )N)rp   )r   r   r   r   rS   r  s    zDomainFilter.domainc             C   s   |\}}}|| j k| j A S )N)rS   r_   )r   r?   rS   r   r   r   r   r   ra   v  s    
zDomainFilter._match)r"   r#   r$   r   r8   rS   ra   rn   r   r   )rg   r   ro   m  s   ro   c               @   sT   e Zd Zdd Zdd Zedd Zdd Zd	d
 Zdd Z	dddZ
dddZdS )Snapshotc             C   s   t || _|| _d S )N)rU   rW   traceback_limit)r   rW   rr   r   r   r   r     s    
zSnapshot.__init__c             C   s*   t |d}tj| |tj W d Q R X d S )Nwb)openpickledumpZHIGHEST_PROTOCOL)r   r4   fpr   r   r   rv     s    zSnapshot.dumpc          	   C   s    t | d}tj|S Q R X d S )Nrb)rt   ru   load)r4   rw   r   r   r   ry     s    zSnapshot.loadc                s@   |rt  fdd|D sdS |r<t  fdd|D r<dS dS )Nc             3   s   | ]}|j  V  qd S )N)ra   )r>   trace_filter)r?   r   r   r@     s   z)Snapshot._filter_trace.<locals>.<genexpr>Fc             3   s   | ]}|j   V  qd S )N)ra   )r>   rz   )r?   r   r   r@     s   T)rk   )r   include_filtersexclude_filtersr?   r   )r?   r   _filter_trace  s    

zSnapshot._filter_tracec                s   t |tstdt|j |rng g  x(|D ] }|jrDj| q. j| q.W  fddjjD }njjj	 }t
|jS )Nz)filters must be a list of filters, not %sc                s   g | ]}j  |r|qS r   )r}   )r>   r?   )r|   r{   r   r   r   
<listcomp>  s    z*Snapshot.filter_traces.<locals>.<listcomp>)rA   r   	TypeErrortyper"   r_   r+   rW   rV   copyrq   rr   )r   filtersrz   Z
new_tracesr   )r|   r{   r   r   filter_traces  s    

zSnapshot.filter_tracesc             C   s  |dkrt d|f |r.|d	kr.t d| i }i }|sx| jjD ]}|\}}}y|| }	W nZ tk
r   |dkr~|}
n(|dkr|d d }
n|d d dff}
t|
}	|	||< Y nX y(||	 }| j|7  _| jd7  _W qF tk
r
   t|	|d||	< Y qFX qFW nx| jjD ]}|\}}}x|D ]}y|| }	W nF tk
r   |dkrd|f}
n|d dff}
t|
}	|	||< Y nX y(||	 }| j|7  _| jd7  _W n& tk
r   t|	|d||	< Y nX q0W qW |S )
Nr   r4   r6   zunknown key_type: %rz/cumulative mode cannot by used with key type %rr5   r   )r   r4   r6   )r6   r4   )
ValueErrorrW   rV   KeyErrorr9   r   r   r   )r   key_type
cumulativeZstatsZ
tracebacksr?   rS   r   Ztrace_tracebackr   r;   r/   r3   r   r   r   	_group_by  sX    



"zSnapshot._group_byFc             C   s,   | j ||}t|j }|jdtjd |S )NT)reversekey)r   listvaluessortr   r!   )r   r   r   Zgroupedr.   r   r   r   r.     s    zSnapshot.statisticsc             C   s6   | j ||}|j ||}t||}|jdtjd |S )NT)r   r   )r   r0   r   r&   r!   )r   Zold_snapshotr   r   r-   r,   r.   r   r   r   
compare_to  s
    
zSnapshot.compare_toN)F)F)r"   r#   r$   r   rv   staticmethodry   r}   r   r   r.   r   r   r   r   r   rq   {  s   3

rq   c              C   s$   t  stdt } t }t| |S )NzLthe tracemalloc module must be tracing memory allocations to take a snapshot)Z
is_tracingRuntimeErrorr   Zget_traceback_limitrq   )rW   rr   r   r   r   take_snapshot  s
    r   )collectionsr   r   	functoolsr   rh   rH   Zos.pathrY   ru   Z_tracemallocr   r   r   r   r&   r0   r1   r9   rP   rQ   rU   r]   r^   rb   ro   rq   r   r   r   r   r   <module>   s0   &0#5%0 	