B
    ™‘[Ð  ã               @   s  d Z ddlmZmZ ddlZddlmZ ddlmZ ddl	m
ZmZmZ ddlZddlmZ ddlmZmZ d	d
ddgZddddgZedd„ eeƒD ƒƒZdZG dd„ dejjjƒZG dd„ dejjjƒZG dd„ dejƒZG dd„ dej jj!j"ƒZ"G dd„ deƒZ#d dd„Z$dS )!zbenchmarking through py.testé    )Úprint_functionÚdivisionN)ÚItem)ÚTerminalSession)ÚceilÚfloorÚlog10)Ú	getsource)Úexec_ÚrangeÚsZmsÚusÚnsé   g     @@g    €„.Ag    eÍÍAc             c   s   | ]\}}||fV  qd S )N© )Ú.0Úir   r   r   ú;lib/python3.7/site-packages/sympy/utilities/benchmarking.pyú	<genexpr>   s    r   é   c               @   s   e Zd Zdd„ ZdS )Ú	Directoryc             C   s   |j }|j}| d¡o|dkS )NÚbench_z.py)ZpurebasenameÚextÚ
startswith)ÚselfÚpathÚbr   r   r   r   Ú
filefilter   s    zDirectory.filefilterN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd„ ZdS )ÚModulec             C   s   |  d¡p|  d¡S )Nr   Útimeit_)r   )r   Únamer   r   r   Úfuncnamefilter&   s    zModule.funcnamefilterN)r   r   r    r$   r   r   r   r   r!   $   s   r!   c               @   s    e Zd Zdejeƒ fdd„ZdS )ÚTimerÚpassc             C   s`   || _ t |d¡}t |d¡}tj||dœ }|| _t|tjdƒ}i }t|||ƒ |d | _d S )Né   é   )ÚstmtÚsetupÚexecÚinner)	ÚtimerÚtimeitZreindentÚtemplateÚsrcÚcompileZdummy_src_namer
   r,   )r   r)   r*   r-   Úglobalsr0   Úcoder   r   r   r   Ú__init__-   s    zTimer.__init__N)r   r   r    r.   Zdefault_timerr2   r4   r   r   r   r   r%   +   s   r%   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚFunctionc                s"   t t| ƒj||Ž d | _d | _d S )N)Úsuperr5   r4   Ú	benchtimeÚ
benchtitle)r   ÚargsÚkw)Ú	__class__r   r   r4   >   s    zFunction.__init__c       	      G   sú   t |ƒ}d | ¡ dd … ¡}|jd k	r2|j| _n| ¡ d  ¡ | _t||jd}| j 	d¡rêd}d}xjt
ddƒD ]\}| |¡}|dkr¢|d| 9 }tt|ƒƒ}P |d	kr´|d9 }qr|d| 9 }tt|ƒƒ}P qrW t| ||¡ƒ| | _n| d¡| _d S )
NÚ
r   r   )r2   r"   r   é
   gš™™™™™É?g{®Gáz”?)r	   ÚjoinÚ
splitlinesZfunc_docr8   Ústripr%   Zfunc_globalsr#   r   r   r.   ÚintÚ_ceilÚminÚrepeatr7   )	r   Útargetr9   r0   r-   rD   Znumberr   Útr   r   r   ÚexecuteC   s,    



zFunction.execute)r   r   r    r4   rG   Ú__classcell__r   r   )r;   r   r5   <   s   r5   c                   s0   e Zd Z‡ fdd„Z‡ fdd„Zdd„ Z‡  ZS )ÚBenchSessionc                s   t t| ƒ |¡ d S )N)r6   rI   Úheader)r   Úcolitems)r;   r   r   rJ   q   s    zBenchSession.headerc                s(   t t| ƒ |¡ | j d¡ |  ¡  d S )Nr<   )r6   rI   ÚfooterÚoutÚwriteÚprint_bench_results)r   rK   )r;   r   r   rL   t   s    zBenchSession.footerc          	      sÚ  | j  d¡ | j  d¡ | j  d¡ | j  d¡ g }xˆ| jD ]~\}}t|tƒr<|j}|d krbd}nD|dkrˆtttt	|ƒƒd ƒ dƒ}nd}dt
|t|  t| f }| |j||jg¡ q<W dgttƒ }dgttƒ }xˆ|D ]€}	|	d	 }| ¡ \}
}t| }y|
 d
¡\}}W n  tk
r2   |
d }}Y nX tt|ƒ|| ƒ||< tt|ƒ|| ƒ||< qàW  xþ|D ]ö}	|	d	 }| ¡ \}
}t| }y|
 d
¡\}}W n  tk
r¾   |
d }}Y nX | || ¡}| || ¡}| ¡ röd
 ||f¡}
nd ||f¡}
d}xFtttƒƒD ]6‰ ˆ |kr.||
7 }n|d|ˆ  |ˆ   d	  7 }qW d||f |	d	< qlW xJtdƒD ]>‰ t‡ fdd„|D ƒƒ}x |D ]}	|	ˆ   |¡|	ˆ < qW qpW x"|D ]}	| j  dt|	ƒ ¡ q¸W d S )Nz==============================
z *** BENCHMARKING RESULTS *** 
r<   z---g        r   z%.*g %sr   r   Ú.Ú ú z%s %sé   c             3   s   | ]}t |ˆ  ƒV  qd S )N)Úlen)r   r   )r   r   r   r   Ë   s    z3BenchSession.print_bench_results.<locals>.<genexpr>z%s  |  %s  |  %s
)rM   rN   Z_memoÚ
isinstancer   r7   rC   rA   Ú_floorr   Ú	precisionÚscalingÚunitsÚappendr#   r8   rT   ÚsplitÚunitnÚ
ValueErrorÚmaxÚrjustÚljustr@   r>   r   Útuple)r   ZresultsÚitemZoutcomeZbestZtstrÚorderZwmZwer   ÚnÚuZunÚmÚeZtxtÚwr   )r   r   rO   z   sj    




"

z BenchSession.print_bench_results)r   r   r    rJ   rL   rO   rH   r   r   )r;   r   rI   o   s   rI   c             C   sB   ddl m} t|_t|_t|_tjj}dd„ |_tjj	 
| ¡ d S )Nr   )Údefaultconftestc               S   s   t S )N)rI   r   r   r   r   Ú<lambda>ß   s    zmain.<locals>.<lambda>)Z
py.__.testri   r   r!   r5   ÚpyÚtestÚconfigZ_getsessionclassZcmdlineÚmain)r9   ri   rm   r   r   r   rn   Õ   s    
rn   )N)%Ú__doc__Z
__future__r   r   rk   Zpy.__.test.itemr   Zpy.__.test.terminal.terminalr   Zmathr   rB   r   rV   r   r.   Úinspectr	   Zsympy.core.compatibilityr
   r   rY   rX   ÚdictÚ	enumerater\   rW   rl   Zcollectr   r!   r%   Ú__rb   r5   rI   rn   r   r   r   r   Ú<module>   s$   	3f