
    daf              
         d Z ddlmZ ddlZddlZddl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Z G d d      ZddZddZdZdZeee	e
eeeeed	Zedk(  rddlZ ej0                  e      Z eej4                         ej7                         Zdej:                  d<   ej<                  ej:                  d<   ej>                  ej:                  d<   ej@                  rej@                  fZ!n e"e      Z!e!D ]<  Z# ee#ej<                  ej>                        Z ejI                  e#e jJ                         > yy)a~  
List sort performance test.

To install `pyperf` you would need to:

    python3 -m pip install pyperf

To run:

    python3 Tools/scripts/sortperf

Options:

    * `benchmark` name to run
    * `--rnd-seed` to set random seed
    * `--size` to set the sorted list size

Based on https://github.com/python/cpython/blob/963904335e579bfe39101adf3fd6a0cf705975ff/Lib/test/sortperf.py
    )annotationsNc                   t        |       D cg c]  }|j                          }}t        d      D ]?  }|j                  |       }|d | }|d |= |j                          |j	                  |       ~A t        |      | k(  sJ |S c c}w )N
   )rangerandom	randrangereverseextendlen)sizerand_resultitemps         -/root/Python-3.12.4/Tools/scripts/sortperf.py_random_datar       s    %*4[1dkkm1F12Y NN4 bqz2A2Jd v;$M 2s   Bc                    t        | |      S N)r   r   r   s     r   	list_sortr   .   s    d##    c                >    t        t        t        | |                  S r   )listreversedlist_sort_ascendingr   s     r   list_sort_descendingr   2   s    ,T489::r   c                ,    t        t        | |            S r   )sortedr   r   s     r   r   r   6   s    ,tT*++r   c                    t        | |      }t        d      D ]5  }|j                  |       }|j                  |       }||   ||   c||<   ||<   7 |S )N   )r   r   r   )r   r   r   r   i1i2s         r   list_sort_ascending_exchangedr$   :   s`     t,F1X 8^^D!^^D!!'VBZr
F2J8 Mr   c                    | dk\  sJ d       t        | |      }t        d      D cg c]  }|j                          c}|dd  |S c c}w )Nr   z(This benchmark requires size to be >= 10i)r   r   r   r   r   r   r   s       r   list_sort_ascending_randomr'   D   sJ    2:AAA: t,F+095aDKKM5F34LM 6s   Ac                    t        | |      }t        | dz        D ]$  }|j                         ||j                  |       <   & |S )Nd   )r   r   r   r   r&   s       r   list_sort_ascending_one_percentr*   L   sD     t,F43; 5'+{{}t~~d#$5Mr   c                j    | dk\  sJ t        d|      }|| dz  z  }t        t        t        |            S )N   )r   r   mapabs)r   r   r   s      r   list_sort_duplicatesr/   T   s<    199 D)Ftqy!F C !!r   c                <    t        t        t        dg| z              S )Ngh)r   r-   r.   r   s     r   list_sort_equalr1   ^   s    C)t+,--r   c                    | dz  }t        t        |dz
  dd            }|j                  t        |             t        t        t        |            S )N      )r   r   r
   r-   float)r   r   halfr   s       r   list_sort_worst_caser8   c   sH     19D%q"b)*F
MM%+ E6"##r   c                  $    e Zd ZddZddZddZy)	Benchmarkc                v    || _         || _        || _        t        j                  | j                        | _        y r   )_name_size_seedr   Random_random)selfnamer   seeds       r   __init__zBenchmark.__init__t   s+    


}}TZZ0r   c                    | j                  |      }t        j                         }|D ]  }|j                           t        j                         |z
  S r   )_prepare_datatimeperf_countersort)rA   loopsall_datastartdatas        r   runzBenchmark.runz   sN    %%e,!!# 	DIIK	   "U**r   c                    t         | j                     } || j                  | j                        }t	        |      D cg c]  }|j                          c}S c c}w r   )
BENCHMARKSr<   r=   r@   r   copy)rA   rJ   benchrM   r   s        r   rF   zBenchmark._prepare_data   sB    4::&TZZ.%*5\2		222s   AN)rB   strr   intrC   rT   returnNone)rJ   rT   rU   r6   )rJ   rT   rU   list[float])__name__
__module____qualname__rD   rN   rF    r   r   r:   r:   s   s    1+3r   r:   c                    |j                   r| j                  |j                          | j                  d|j                          | j                  d|j                          y )Nz--size=z--rng-seed=)	benchmarkappendr   rng_seed)cmdargss     r   add_cmdline_argsrb      sG    ~~

4>>"JJ$%JJT]]O,-r   c           
        | j                  dt        ddj                  dj                  t                           | j                  dt        t
        dt
         d	       | j                  d
t        t        dt         d	       y )Nr]   ?zCan be any of: {0}z, )choicesnargshelpz--sizez$Size of the lists to sort (default: ))typedefaultrg   z
--rng-seedz'Random number generator seed (default: )add_argumentrP   formatjoinrT   DEFAULT_SIZEDEFAULT_RANDOM_SEED)parsers    r   add_parser_argsrq      s    
!((:)>?	   3L>C	   #67J6K1M	  r   i @  )	r   r   r   r$   r'   r*   r/   r1   r8   __main__)rb   z&Test `list.sort()` with different datadescriptionlist_sort_sizelist_sort_random_seed)r   rT   r   zrandom.RandomrU   rW   )r`   z	list[str]rU   rV   )rp   zargparse.ArgumentParserrU   rV   )&__doc__
__future__r   argparserG   r   r   r   r   r   r$   r'   r*   r/   r1   r8   r:   rb   rq   rn   ro   rP   rX   pyperfRunnerrunner	argparser
parse_argsra   metadatar   r_   r]   
benchmarksr   rR   bench_time_funcrN   r[   r   r   <module>r      sV  ( #   $;,".
	$ 3 3,.*  0.%B"<'F0&0

 zV]],<=FF$$%D%MFOOM"(,		FOO$%/3}}FOO+,~~nn&
J'
 5eTYY>	uimm45! r   