B
    Y                 @   sH   d dl Zd dlZddlmZ dgZdddZdd	 Zd
d Zdd Z	dS )    N   )
autotimeitbench_detailednansum        c       	      C   s  | dkr6t jddd}|  x|D ]}t|| q$W |dk sF|dkrNtdd}td|   td	|t jtjf  td
|  |dkrtd|  ntd||d f  td td t| |}xL|D ]D}|d }t	|d |d |d }td||d 
d|d f  qW dS )a=  
    Benchmark a single function in detail or, optionally, all functions.

    Parameters
    ----------
    function : str, optional
        Name of function, as a string, to benchmark. Default ('nansum') is
        to benchmark bn.nansum. If `function` is 'all' then detailed
        benchmarks are run on all bottleneck functions.
    fraction_nan : float, optional
        Fraction of array elements that should, on average, be NaN. The
        default (0.0) is not to set any elements to NaN.

    Returns
    -------
    A benchmark report is printed to stdout.

    allT)	as_stringr   r   z1`fraction_nan` must be between 0 and 1, inclusivez    z%s benchmarkz%sBottleneck %s; Numpy %sz0%sSpeed is NumPy time divided by Bottleneck timez$%sNone of the array elements are NaNz3%s%.1f%% of the array elements are NaN (on average)d    z-   Speed  Call                          Arrayname
statementssetuprepeatz%8.1f  %s   %s   N)bnget_functionssortr   
ValueErrorprint__version__np
benchsuitetimerljust)	functionfraction_nanZfuncsfuncZtabsuiteZtestr   speed r   Blib/python3.7/site-packages/bottleneck/benchmark/bench_detailed.pyr   	   s,    


c          	   C   s\   t | dkrtdtjdd* t| d ||d}t| d ||d}W d Q R X || }|S )N   zTwo statements needed.ignore)Zinvalidr   )r   r   )lenr   r   Zerrstater   )r   r   r   Zt0Zt1r   r   r   r    r   <   s    r   c          
   C   s   d}d dd |dD }| tjdddkr6d}nN| d	krDd}n@| tjd
ddkr\d}n(| dkrjd}n| dkrxd}ntd|  t }| }g }x|D ]}||d  }|d krq|d }	|d }
i }|| |	g|d< d| d| g|d< |||||||	||f |d< |
|d< || qW |S )Na+  
        from bottleneck import %s as bn_fn
        try: from numpy import %s as sl_fn
        except ImportError: from bottleneck.slow import %s as sl_fn

        # avoid all-nan slice warnings from np.median and np.nanmedian
        if "%s" == "median": from bottleneck.slow import median as sl_fn
        if "%s" == "nanmedian": from bottleneck.slow import nanmedian as sl_fn

        from numpy import array, nan
        from numpy.random import RandomState
        rand = RandomState(123).rand

        a = %s
        if %s != 0: a[a < %s] = nan
    
c             S   s   g | ]}|  qS r   )strip).0sr   r   r    
<listcomp>Y   s    zbenchsuite.<locals>.<listcomp>reduceT)r   r   )ZrankdataZnanrankdataZmover   )	partitionZargpartitionpushr!   replace   z`function` (%s) not recognizedr   Zbn_fnZsl_fnr   r   r   )joinsplitr   r   r   get_instructionsappend)r   r   r   indexinstructionsfr   ZinstructionZ	signatureZarrayr   runr   r   r    r   F   s<    
r   c              C   s.   ddddddddd	d
dddddddddg} | S )N)zrand(1)z(a)z(a, 1)z(a, 0)z(a, np.nan, 0)
   )zrand(10)z(a)z(a, 2)z(a, 2)z(a, np.nan, 0)r7   )z	rand(100)z(a)z(a, 20)z(a, 20)z(a, np.nan, 0)   )z
rand(1000)z(a)z(a, 200)z(a, 200)z(a, np.nan, 0)r-   )zrand(1000000)z(a)z(a, 200)z(a, 200)z(a, np.nan, 0)r!   )zrand(10, 10)z(a)z(a, 2)z(a, 2)z(a, np.nan, 0)r8   )zrand(100, 100)z(a)z(a, 20)z(a, 20)z(a, np.nan, 0)r-   )zrand(1000, 1000)z(a)z(a, 200)z(a, 200)z(a, np.nan, 0)r!   )zrand(10, 10)z(a, 1)NNNr8   )zrand(100, 100)z(a, 1)NNNr-   )zrand(1000, 1000)z(a, 1)NNNr!   )zrand(100000, 2)z(a, 1)z(a, 1)z(a, 1)Nr!   )zrand(10, 10)z(a, 0)NNNr8   )zrand(100, 100)z(a, 0)z(a, 20, axis=0)NNr-   )zrand(1000, 1000)z(a, 0)z(a, 200, axis=0)NNr!   )zrand(100, 100, 100)z(a, 0)z(a, 20, axis=0)z(a, 20, axis=0)Nr!   )zrand(100, 100, 100)z(a, 1)z(a, 20, axis=1)z(a, 20, axis=1)Nr!   )zrand(100, 100, 100)z(a, 2)z(a, 20, axis=2)z(a, 20, axis=2)z(a, np.nan, 0)r!   )z
array(1.0)z(a)NNz	(a, 0, 2)r7   r   )r4   r   r   r    r1   ~   s(    	r1   )r   r   )
Znumpyr   Z
bottleneckr   r   __all__r   r   r   r1   r   r   r   r    <module>   s   
3
8