o
    հi#                     @   sN  d Z ddlZddlZddlZddlZddlZddlZddlZddlZe	 Z
dd Zedd Zedd Zed	d
 Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zdd Zdd Ze Zdd Zdd  ZG d!d" d"ZG d#d$ d$Zd%d& Zd'd( Zd)d* Zd0d+d,Z d-d. Z!e"d/kre!  dS dS )1z 
Benchmarking utility for ijson
    Nc                 C   s   | t | j< | S N)_benchmarks__name__)f r   C/home/ubuntu/.local/lib/python3.10/site-packages/ijson/benchmark.py	benchmark      
r   c                 C       dd dd t| D  d S )N   [   ,c                 S   s   g | ]}d qS )   1r   .0_r   r   r   
<listcomp>   s    zlong_list.<locals>.<listcomp>   ]joinrangenr   r   r   	long_list       r   c                 C   r
   )N   {   ,
c                 S      g | ]}d ||f qS )s   "key_%d": %dr   r   ir   r   r   r   !       z"big_int_object.<locals>.<listcomp>   }r   r   r   r   r   big_int_object   r   r!   c                 C   r
   )Nr   r   c                 S   r   )s   "key_%d": %d.0r   r   r   r   r   r   %   r   z&big_decimal_object.<locals>.<listcomp>r    r   r   r   r   r   big_decimal_object#   r   r"   c                 C   r
   )Nr   r   c                 S   s   g | ]}d |f qS )s   "key_%d": nullr   r   r   r   r   r   )   s    z#big_null_object.<locals>.<listcomp>r    r   r   r   r   r   big_null_object'   r   r#   c                 C   r
   )Nr   r   c                 S   s(   g | ]}d ||d dkrdndf qS )s   "key_%d": %s   r   s   trues   falser   r   r   r   r   r   -   s    z#big_bool_object.<locals>.<listcomp>r    r   r   r   r   r   big_bool_object+   s
   r%   c                 C   r
   )Nr   r   c                 S   r   s   "key_%d": "value_%d"r   r   r   r   r   r   3   r   z"big_str_object.<locals>.<listcomp>r    r   r   r   r   r   big_str_object1   r   r'   c                    s(   d dd  fddt| D  d S )NsC   value that is very long and should cause a bit less of JSON parsingr   r   c                    s   g | ]}d | f qS )s   "key_%d": "%s"r   r   str_templater   r   r   8   r   z&big_longstr_object.<locals>.<listcomp>r    r   r   r   r(   r   big_longstr_object5   s   $r*   c                    sD   dd dd tdD  d  dd  fdd	t| D  d
 S )Nr   r   c                 S   r   r&   r   r   r   r   r   r   <   r   z'object_with_10_keys.<locals>.<listcomp>
   r    r   c                 3   s    | ]} V  qd S r   r   r   templater   r   	<genexpr>=   s
    
z&object_with_10_keys.<locals>.<genexpr>r   r   r   r   r,   r   object_with_10_keys:   s    r/   c                 C   r
   )Nr      , c                 s       | ]}d V  qdS )s   []Nr   r   r   r   r   r.   C       zempty_lists.<locals>.<genexpr>r   r   r   r   r   r   empty_listsA   r   r3   c                 C   r
   )Nr   r0   c                 s   r1   )s   {}Nr   r   r   r   r   r.   G   r2   z empty_objects.<locals>.<genexpr>r   r   r   r   r   r   empty_objectsE   r   r4   c                 C   s   dd |  dD S )Nc                 S   s   g | ]}t | qS r   )r   r   namer   r   r   r   J       z$parse_benchmarks.<locals>.<listcomp>,)split)sr   r   r   parse_benchmarksI   s   r;   c               	   C   s<   t  } tjD ]}z	t|| |< W q ty   Y qw | S r   )collectionsOrderedDictijsonALL_BACKENDSget_backendImportError)backendsbackend_namer   r   r   load_backendsM   s   
rD   c                 C   s(   t  }| dD ]}t| ||< q	|S )Nr8   )r<   r=   r9   	_backends)r:   rB   r6   r   r   r   parse_backendsW   s   rF   c                 C   s(   t j}| r||  |  d S d S r   )sysstdoutisattywriteflush)messagerH   r   r   r   _stdout_tty_write_flush^   s
   
rM   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )progress_messagec                 C   s
   || _ d S r   )rL   )selfrL   r   r   r   __init__g   s   
zprogress_message.__init__c                 C   s   t | j | S r   )rM   rL   rO   r   r   r   	__enter__j   r	   zprogress_message.__enter__c                 G   s   t d d S )Nz[K)rM   )rO   argsr   r   r   __exit__n   s   zprogress_message.__exit__N)r   
__module____qualname__rP   rR   rT   r   r   r   r   rN   e   s    rN   c                   @   s&   e Zd Zdd Zd	ddZdd ZdS )
AsyncReaderc                 C   s   t || _d S r   )ioBytesIOdata)rO   rZ   r   r   r   rP   s   s   zAsyncReader.__init__c                    s   | j |S r   )rZ   read)rO   r   r   r   r   r\   v   s   zAsyncReader.readc                 C   s   | j   d S r   )rZ   closerQ   r   r   r   r]   y   s   zAsyncReader.closeN)r[   )r   rU   rV   rP   r\   r]   r   r   r   r   rW   r   s    
rW   c                    s,   | |g|R i |2 z3 d H W }q6 d S r   r   )methodreadermethod_argsmethod_kwargsr   r   r   r   
_run_async|   s   "rb   c                 C   sH   t | }t|}|d dkr||d d  ||d   d S ||d  S )Nr$   r      g       @)sortedlen)valuessorted_valuesr   r   r   r   median   s
    rh   c                 C   s,   t | }t| |tt|  t| t| fS r   )summinfloatre   rh   max)rf   totalr   r   r   stats   s   $rn   c              
      s  t t ks
J r0j}td|f   jt}W d    n1 s*w   Y  n}tj} fdd} j	 D ]\}} j
 jrUd7 n jr\d7 t|d j
dv rl jf j jd js{ jd	<  jrd
d l}| fdd}	n jr fdd}	nfdd}	g }
tj}t jD ]'}t| }| }|	| |
| |  W d    n1 sw   Y  q|d d  j
||ft|
 tfdd|
D  }td|  qFd S )Nz#Generating data for benchmark %s...c                      s&   st dS  jrtS tS )Nrb)open	run_asyncrW   rX   rY   r   )rS   benchmark_funcrZ   fnamer   r   
get_reader   s
   

z"run_benchmarks.<locals>.get_reader_async_coror   )itemskvitems)multiple_values	use_floatbuf_sizer   c                    s8   z  t| gR i  W    d S    w r   )run_until_completerb   r]   r_   )loopr^   r`   ra   r   r   run   s    zrun_benchmarks.<locals>.runc                    sb   ddl m} | }|gR i }t fdddD ]}|| |d d = q|  d S )Nr   )sendable_listc                      s     jS r   )r\   bufsizer   )rS   r_   r   r   <lambda>   s    z-run_benchmarks.<locals>.run.<locals>.<lambda>    )ijson.utilsr   itersendr]   )r_   r   eventscorochunk)rS   r^   r`   ra   r}   r   r      s   
c                    s     | gR i D ]}qd S r   r   )r_   r   )r^   r`   ra   r   r   r      s   g      @c                    s   g | ]} | qS r   r   )r   duration)	megabytesr   r   r      r7   z"run_benchmarks.<locals>.<listcomp>z@%.3f, %s, %s, %s, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f)boolr   rN   sizere   osstatst_sizerB   rw   r^   rq   run_corogetattrprefixry   rz   r   asyncionew_event_looptimeperf_counterr   
iterations
contextlibclosingappendrn   print)rS   rr   rs   bnamer   rt   rC   backendr   r   	durationsnow	iterationr_   startresultsr   )	rS   rr   rZ   rs   r~   r   r^   r`   ra   r   run_benchmarks   sf   





	r   c            
      C   s  d} d}d}d t}d t}t }|jddtd|  | d |jd	d
td| |d |jddtd| |d |jddtd| |d |jddtd| |d |jddddd |jdddd |jdddd d!d" |jd#d$dd d%d" |jd&d'g d(d)d*d+ |jd,d-dd d.d/d0 |jd1d2dd d3d4d0 |jd5d6d7d8d9 |	 }|j
rd:}|d; d<d= tD 7 }|d>7 }|d; d?d= tD 7 }t| d S td@ |jr|jD ]}t||dA qd S |jD ]}	t||	 qd S )BNi rc   i   r8   z-sz--sizezGSize of JSON content; actual size in bytes might differ, defaults to %d)typehelpdefaultz-Iz--iterationsz;How many times each method should be tested, defaults to %dz-Sz	--bufsizez/Buffer size used during parsing; defaults to %dz-bz--benchmarksz=Comma-separated list of benchmarks to include, defaults to %sz-Bz
--backendsz;Comma-separated list of backends to include, defaults to %sz-lz--list
store_truez&List available benchmarks and backends)actionr   inputs*zFFile to use for benchmarks rather than built-in benchmarking functions)nargsr   z-Mz--multiple-valuesFz:Content has multiple JSON values, useful when used with -i)r   r   r   z-fz--use-floatz5Parse non-integer numbers as float instead of Decimalz-mz--method)basic_parseparserx   rw   zThe method to benchmarkr   )choicesr   r   z-cz--coror   zBenchmark coroutine methods)r   r   destr   z-az--asyncrq   z!Benchmark asyncio-enabled methodsz-pz--prefixz#Prefix (used with -M items|kvitems) )r   r   z
Backends:

c                 s       | ]}d | V  qdS z - %sNr   r5   r   r   r   r.         zmain.<locals>.<genexpr>z
Benchmarks:
c                 s   r   r   r   r5   r   r   r   r.     r   z#mbytes, method, test_case, backend, time_min, time_avg, time_median, time_max, mb_per_sec_min, mb_per_sec_avg, mb_per_sec_median, mb_per_sec_max)rs   )r   r   rE   argparseArgumentParseradd_argumentintr;   rF   
parse_argslistr   r   r   
benchmarks)
	DEFAULT_NDEFAULT_ITERATIONSDEFAULT_BUFSIZEALL_BENCHMARKSr?   parserrS   msgfilenamer   r   r   r   main   s   









r   __main__)NN)#__doc__r   r<   r   rX   r   rG   r   r>   r=   r   r   r   r!   r"   r#   r%   r'   r*   r/   r3   r4   r;   rD   rE   rF   rM   rN   rW   rb   rh   rn   r   r   r   r   r   r   r   <module>   s\   











N7
