o
     JAfWY                     @   sp   	 d dl Z d dlZd dlZg dZG dd dZdddZddd	ZG d
d dZdd Ze	dkr6e  dS dS )    N)runrunctxProfilec                   @   s.   e Zd Z	 dd Zdd Zdd Zdd Zd	S )
_Utilsc                 C   s
   || _ d S N)profiler)selfr    r	   /usr/lib/python3.10/profile.py__init__/      
z_Utils.__init__c                 C   sd   |   }z%z|| W n	 ty   Y nw W | ||| d S W | ||| d S | ||| w r   )r   r   
SystemExit_show)r   	statementfilenamesortprofr	   r	   r
   r   2   s   "z
_Utils.runc                 C   sh   |   }z'z	|||| W n	 ty   Y nw W | ||| d S W | ||| d S | ||| w r   )r   r   r   r   )r   r   globalslocalsr   r   r   r	   r	   r
   r   ;   s   "z_Utils.runctxc                 C   s$   |d ur| | d S || d S r   )
dump_statsprint_stats)r   r   r   r   r	   r	   r
   r   D   s   z_Utils._showN)__name__
__module____qualname__r   r   r   r   r	   r	   r	   r
   r   )   s    		r   c                 C   s   	 t t| ||S r   )r   r   r   )r   r   r   r	   r	   r
   r   P   s   
r   c                 C   s   	 t t| ||||S r   )r   r   r   )r   r   r   r   r   r	   r	   r
   r   ]   s   r   c                   @   s   e Zd Z	 dZd3d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e
e	eeeedZdd ZG dd dZG dd dZdd Zdd Zd4d!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd5d/d0Zd1d2 ZdS )6r   r   Nc                 C   s   i | _ d | _d| _d| _|d u r| j}|| _|s$tj | _| _| j	| _
n5|| _|  }zt|}W n tyA   || _| j	| _
Y nw |dkrK| j| _
n| j| _
|tfdd}|| _|  | _| d d S )N    c                 S   s
   ||  S r   r	   )timersumr	   r	   r
   get_time_timer   r   z(Profile.__init__.<locals>.get_time_timerr   )timingscurcmdc_func_namebiastimeprocess_timer   get_timetrace_dispatch_i
dispatcherlen	TypeErrortrace_dispatchtrace_dispatch_lr   tsimulate_call)r   r   r$   r.   lengthr   r	   r	   r
   r      s2   


zProfile.__init__c                 C   s   | j }| }|d |d  | j | j }|dkr|j| _| j| | ||r3| }|d |d  | _d S | }|d |d  | | _d S )Nr      c_callr   r.   r$   r   r#   dispatch)r   frameeventargr   r.   rr	   r	   r
   r,      s   zProfile.trace_dispatchc                 C   V   | j }| | j | j }|dkr|j| _| j| | ||r#| | _d S | | | _d S Nr2   r3   r   r5   r6   r7   r   r.   r	   r	   r
   r(         zProfile.trace_dispatch_ic                 C   sb   | j }| d | j | j }|dkr|j| _| j| | ||r'| d | _d S | d | | _d S )Ng      N@r2   r3   r;   r	   r	   r
   trace_dispatch_mac   s   zProfile.trace_dispatch_macc                 C   r9   r:   )r'   r.   r$   r   r#   r4   )r   r5   r6   r7   r'   r.   r	   r	   r
   r-      r<   zProfile.trace_dispatch_lc           	      C   sD   | j \}}}}}}||ur|r| ||S ||| ||||f| _ dS Nr1   )r!   trace_dispatch_return)	r   r5   r.   rptritretrfnrframercurr	   r	   r
   trace_dispatch_exception   s
   z Profile.trace_dispatch_exceptionc                 C   s   | j r |j| j d ur | j \}}}}}}t|tjs | |d |j}	|	j|	j|	j	f}
|dd|
|| j f| _ | j
}|
|v rR||
 \}}}}}||d |||f||
< dS ddddi f||
< dS Nr   r1   )r!   f_back
isinstancer   
fake_framer?   f_codeco_filenameco_firstlinenoco_namer    )r   r5   r.   r@   rA   rB   rC   rD   rE   Zfcodefnr    ccnsttctcallersr	   r	   r
   trace_dispatch_call   s   zProfile.trace_dispatch_callc           
      C   sp   dd| j f}|dd||| jf| _| j}||v r-|| \}}}}}	||d |||	f||< dS ddddi f||< dS )Nr   r   r1   )r#   r!   r    )
r   r5   r.   rP   r    rQ   rR   rS   rT   rU   r	   r	   r
   trace_dispatch_c_call  s   zProfile.trace_dispatch_c_callc                 C   s   || j d ur| | j d d | j \}}}}}}|| }|| }|\}	}
}}}}|	|
| || |||f| _ | j}|| \}}}}}|sL|| }|d }||v rY|| d ||< nd||< ||d || ||f||< dS rG   )r!   r?   r    )r   r5   r.   r@   rA   rB   rC   rE   Zframe_totalZpptZpitZpetZpfnpframeZpcurr    rQ   rR   rS   rT   rU   r	   r	   r
   r?   !  s"   zProfile.trace_dispatch_return)call	exceptionreturnr2   Zc_exceptionZc_returnc                 C   s"   | j d rd S || _| | d S Nr   )r!   r"   r/   )r   r"   r	   r	   r
   set_cmdW  s   zProfile.set_cmdc                   @   s   e Zd Zdd Zdd ZdS )zProfile.fake_codec                 C   s   || _ || _|| _d| _d S Nr   )rM   co_linerO   rN   )r   r   linenamer	   r	   r
   r   ]  s   
zProfile.fake_code.__init__c                 C   s   t | j| j| jfS r   )reprrM   r_   rO   r   r	   r	   r
   __repr__c  s   zProfile.fake_code.__repr__N)r   r   r   r   rd   r	   r	   r	   r
   	fake_code\  s    re   c                   @   s   e Zd Zdd ZdS )zProfile.fake_framec                 C   s   || _ || _d S r   )rL   rI   )r   codeZpriorr	   r	   r
   r   g  s   
zProfile.fake_frame.__init__N)r   r   r   r   r	   r	   r	   r
   rK   f  s    rK   c                 C   sF   |  dd|}| jr| jd }nd }| ||}| jd | |d d S )NZprofiler   rH   rY   )re   r!   rK   r4   )r   ra   rf   rX   r5   r	   r	   r
   r/   k  s   zProfile.simulate_callc                 C   sR   | j }| | j }| jd r!| jd | | jd | d}| jd s| | | _d S )Nr   r[   rH   r   )r'   r.   r!   r4   )r   r'   r.   r	   r	   r
   simulate_cmd_completew  s   

zProfile.simulate_cmd_completer   c                 C   s$   dd l }||  |  d S r^   )pstatsZStatsZ
strip_dirsZ
sort_statsr   )r   r   rh   r	   r	   r
   r     s   
zProfile.print_statsc                 C   sF   t |d}|   t| j| W d    d S 1 sw   Y  d S )Nwb)opencreate_statsmarshaldumpstats)r   filefr	   r	   r
   r     s   "zProfile.dump_statsc                 C   s   |    |   d S r   )rg   snapshot_statsrc   r	   r	   r
   rk     s   zProfile.create_statsc           	      C   s^   i | _ | j D ]$\}\}}}}}| }d}| D ]}||7 }q|||||f| j |< qd S r^   )rn   r    itemscopyvalues)	r   funcrQ   rR   rS   rT   rU   ZncZcallcntr	   r	   r
   rq     s   
zProfile.snapshot_statsc                 C   s   dd l }|j}| |||S r^   )__main____dict__r   )r   r"   rv   dictr	   r	   r
   r     s   zProfile.runc              	   C   s@   |  | t| j zt||| W td  | S td  w r   )r]   sys
setprofiler)   exec)r   r"   r   r   r	   r	   r
   r     s   

zProfile.runctxc             	   O   sB   |  t| t| j z||i |W td  S td  w r   )r]   rb   ry   rz   r)   )r   ru   argskwr	   r	   r
   runcall  s
   zProfile.runcallc                 C   s<   | j tur	td| j}d| _z
| ||W || _S || _w )Nz&Subclasses must override .calibrate().r   )	__class__r   r+   r$   _calibrate_inner)r   mverboseZ
saved_biasr	   r	   r
   	calibrate  s   
zProfile.calibratec                 C   s  | j }dd }|fdd}|| | }|| | }|| }|r&td| t }	| }|	dt t  | }|| }
|rCtd|
 d}d}|	j D ]\\}}}\}}}}}|d	v rd||7 }||7 }qL|rqtd
| td| ||d kr}td| || d | }|rtd| |S )Nc                 S   s   t | D ]}d}qd S r>   range)nixr	   r	   r
   f1  s   z$Profile._calibrate_inner.<locals>.f1c                 S   s   t | D ]}|d qd S )Nd   r   )r   r   r   r	   r	   r
   rp     s   
z#Profile._calibrate_inner.<locals>.fz elapsed time without profiling =zf(m)zelapsed time with profiling =g        )rp   r   z!'CPU seconds' profiler reported =ztotal # calls =r1   z internal error: total calls = %dg       @z+mean stopwatch overhead per profile event =)	r'   printr   r   r   r   r    rr   
ValueError)r   r   r   r'   r   rp   t0t1Zelapsed_noprofilepZelapsed_profileZtotal_callsZreported_timer   r`   funcnamerQ   rR   rS   rT   rU   meanr	   r	   r
   r     sD   




zProfile._calibrate_inner)NN)r   )r   )r   r   r   r$   r   r,   r(   r=   r-   rF   rV   rW   r?   r4   r]   re   rK   r/   rg   r   r   rk   rq   r   r   r~   r   r   r	   r	   r	   r
   r   f   sB    &
''



1r   c               
   C   s  dd l } ddlm} d}||d}d|_|jdddd	d d
 |jdddddd |jdddddd
 tjdd  sB|  td |	 \}}|tjd d < |j
d ur\| j|j
|_
t|dkr|jrtdd l}d}|j|d d}n3|d }	tjd| j|	 t|	d}
t|
 |	d}W d    n1 sw   Y  |	dd d d}zt||d |j
|j W |S  ty } zd t_t|j W Y d }~|S d }~ww |  |S )Nr   )OptionParserzMprofile.py [-o output_file_path] [-s sort] [-m module | scriptfile] [arg] ...)usageFz-oz	--outfileoutfilezSave stats to <outfile>)desthelpdefaultz-mmodule
store_truezProfile a library module.)r   actionr   r   z-sz--sortr   z?Sort order when printing to stdout, based on pstats.Stats classr   r1   r   z(run_module(modname, run_name='__main__'))
run_modulemodnamerbr{   rv   )__file__r   __package__
__cached__)osZoptparser   Zallow_interspersed_argsZ
add_optionry   argvprint_usageexit
parse_argsr   pathabspathr*   r   runpyr   insertdirnamerj   compilereadr   r   BrokenPipeErrorstdouterrno)r   r   r   parseroptionsr|   r   rf   ZglobsZprognamefpexcr	   r	   r
   main(  sd   





r   rv   r\   )
ry   r%   rl   __all__r   r   r   r   r   r   r	   r	   r	   r
   <module>   s    

'
	   E9
