U
    /e                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ eddZ	e
eZe	edd Ze	ee	ed	d
 Ze	edd Ze	edd Ze	ee	ee	ee	edd ZG dd dZe	edd Ze	edd Ze	ddd Z e	ddd Z!e	ddd Z"e	d d!d" Z#e	d#d$d% Z$e	d&d'd( Z%e	d)d*d+ Z&d,d- Z'e'  dS ).    N)array)entry_points)Dispatchsizeof)namec                 C   s
   t | S Nsys	getsizeofo r   //tmp/pip-unpacked-wheel-dbjnr7gq/dask/sizeof.pysizeof_default   s    r   c                 C   s   t | S r   lenr   r   r   r   sizeof_bytes   s    r   c                 C   s   | j S r   )nbytesr   r   r   r   sizeof_memoryview   s    r   c                 C   s   | j t|  S r   )itemsizer   r   r   r   r   sizeof_array   s    r   c                 C   s|   t | }d}||kr`t| ttfr0t| |}nt| |}t	| t
|| ttt|  S t	| ttt|  S d S )N
   )r   
isinstanceset	frozenset	itertoolsislicerandomsampler	   r
   intsummapr   )seqZ	num_itemsZnum_samplesZsamplesr   r   r   sizeof_python_collection$   s    
r#   c                   @   s   e Zd ZdZdS )SimpleSizeofa  Sentinel class to mark a class to be skipped by the dispatcher. This only
    works if this sentinel mixin is first in the mro.

    Examples
    --------

    >>> class TheAnswer(SimpleSizeof):
    ...         def __sizeof__(self):
    ...             # Sizeof always add overhead of an object for GC
    ...             return 42 - sizeof(object())

    >>> sizeof(TheAnswer())
    42

    N)__name__
__module____qualname____doc__r   r   r   r   r$   :   s   r$   c                 C   s
   t | S r   r   dr   r   r   sizeof_blockedL   s    r+   c                 C   s8   t | tt|   tt|   dtt   S )N   )r	   r
   r   listkeysvaluesr)   r   r   r   sizeof_python_dictQ   s    r0   cupyc                  C   s    dd l } t| jdd }d S )Nr   c                 S   s
   t | jS r   r   r   xr   r   r   sizeof_cupy_ndarray_   s    z*register_cupy.<locals>.sizeof_cupy_ndarray)r1   r   registerndarray)r1   r5   r   r   r   register_cupy[   s    
r8   numbac                  C   s&   dd l } t| jjjjdd }d S )Nr   c                 S   s
   t | jS r   r2   r3   r   r   r   sizeof_numba_devicendarrayh   s    z2register_numba.<locals>.sizeof_numba_devicendarray)Z
numba.cudar   r6   ZcudaZcudadrvZdevicearrayZDeviceNDArray)r9   r:   r   r   r   register_numbad   s    r;   rmmc                  C   s*   dd l } t| dr&t| jdd }d S )Nr   DeviceBufferc                 S   s
   t | jS r   r2   r3   r   r   r   sizeof_rmm_devicebuffert   s    z-register_rmm.<locals>.sizeof_rmm_devicebuffer)r<   hasattrr   r6   r=   )r<   r>   r   r   r   register_rmmm   s    

r@   numpyc                  C   s    dd l } t| jdd }d S )Nr   c                 S   s2   d| j kr(| tdd | j D  }|jS t| jS )Nr   c                 s   s&   | ]}|d krt dnt dV  qdS )r   N   )slice).0sr   r   r   	<genexpr>   s     z?register_numpy.<locals>.sizeof_numpy_ndarray.<locals>.<genexpr>)stridestupler   r   )r4   xsr   r   r   sizeof_numpy_ndarray}   s    
z,register_numpy.<locals>.sizeof_numpy_ndarray)rA   r   r6   r7   )nprJ   r   r   r   register_numpyy   s    
rL   pandasc                     s   dd l dd l} ddlm}m |r4t| df ntf fddt| j	 fdd}t| j
 fdd	}t| j fd
d}t| jfdd}d S )Nr   )PANDAS_GT_130dtype_eqpythonc                     s   | sdS t dd | D }|s"dS i }| D ]0} jj|ddd}| D ]}||t|< qHq*dt|  }t dd | D }t|| dkrt|| | S |S d S )	Nr   c                 s   s   | ]}t |V  qd S r   r   )rD   r4   r   r   r   rF      s     z7register_pandas.<locals>.object_size.<locals>.<genexpr>d   T)sizereplacec                 s   s   | ]}t |V  qd S r   r   )rD   ir   r   r   rF      s     g      ?)r    r   choicetolistidr   r/   r   )rI   ZncellsZunique_samplesr4   r   rU   ZnsamplesZsample_nbytes)rK   r   r   object_size   s    z$register_pandas.<locals>.object_sizec                    s   t | jt | j }g }d }| j D ]N}|d ks>||jsL|j}|d7 }||jddd7 }|j kr&||j q&|| 7 }t	d|S Ni  F)indexdeep)
r   r[   columnsZ_seriesr/   dtypememory_usageappend_valuesmax)ZdfpZobject_colsZ
prev_dtypecol)OBJECT_DTYPESrO   rY   r   r   sizeof_pandas_dataframe   s    
z0register_pandas.<locals>.sizeof_pandas_dataframec                    s8   dt | j | jddd }| j kr4|| j7 }|S rZ   )r   r[   r_   r^   ra   )rE   rc   re   rY   r   r   sizeof_pandas_series   s    
z-register_pandas.<locals>.sizeof_pandas_seriesc                    s*   d| j dd }| j kr&|| 7 }|S )N  F)r\   )r_   r^   )rU   rc   rg   r   r   sizeof_pandas_index   s    
z,register_pandas.<locals>.sizeof_pandas_indexc                    s(   d | j   }| jD ]}||j7 }q|S )Nri   )levelscodesr   )rU   rc   c)rY   r   r   sizeof_pandas_multiindex   s    
z1register_pandas.<locals>.sizeof_pandas_multiindex)rA   rM   Zdask.dataframe._compatrN   rO   objectZStringDtyper   r6   Z	DataFrameZSeriesZIndexZ
MultiIndex)pdrN   rf   rh   rj   rn   r   )re   rO   rK   rY   r   register_pandas   s    



rq   scipyc                  C   s8   ddl m}  t| jdd }t| jdd }d S )Nr   )sparsec                 S   s   |   S r   )
__sizeof__rE   r   r   r   sizeof_spmatrix_dok   s    z.register_spmatrix.<locals>.sizeof_spmatrix_dokc                 S   s   t dd | j D S )Nc                 s   s   | ]}t |V  qd S r   rT   )rD   vr   r   r   rF      s     z=register_spmatrix.<locals>.sizeof_spmatrix.<locals>.<genexpr>)r    __dict__r/   ru   r   r   r   sizeof_spmatrix   s    z*register_spmatrix.<locals>.sizeof_spmatrix)rr   rs   r   r6   Z
dok_matrixZspmatrix)rs   rv   ry   r   r   r   register_spmatrix   s
    


rz   pyarrowc                     sH   dd l fdd tj fdd} tj fdd}d S )Nr   c                    sD   d}t |  js| j} |  D ] }| D ]}|r*||j7 }q*q|S )Nr   )r   ChunkedArraydataZ
iterchunksbuffersrR   )r}   rc   chunkbuffer)par   r   _get_col_size   s    z'register_pyarrow.<locals>._get_col_sizec                    s2   t | jj}|  D ]}| |7 }qt|d S Ni  )r   ZschemametadataZitercolumnsr   )tablerc   rd   r   r   r   sizeof_pyarrow_table   s    z.register_pyarrow.<locals>.sizeof_pyarrow_tablec                    s   t  | d S r   )r   )r}   r   r   r   sizeof_pyarrow_chunked_array   s    z6register_pyarrow.<locals>.sizeof_pyarrow_chunked_array)r{   r   r6   ZTabler|   )r   r   r   )r   r   r   register_pyarrow   s    


r   c               	   C   sP   t ddD ]@} |  }z|t W q
 tk
rH   td| j  Y q
X q
dS )zERegister sizeof implementations exposed by the entry_point mechanism.zdask.sizeof)groupz&Failed to register sizeof entry point N)r   loadr   	Exceptionlogger	exceptionr   )Zentry_pointZ	registrarr   r   r   _register_entry_point_plugins   s    
r   )(r   loggingr   r	   r   Zdask.compatibilityr   Z
dask.utilsr   r   	getLoggerr%   r   r6   ro   r   bytes	bytearrayr   
memoryviewr   r   r-   rH   r   r   r#   r$   r+   dictr0   Zregister_lazyr8   r;   r@   rL   rq   rz   r   r   r   r   r   r   <module>   sV   






	




S

