Dask के map_partitions का उपयोग करने का सबसे सरल तरीका है । आपको इन आयातों की आवश्यकता है (आपको इसकी आवश्यकता होगी pip install dask
):
import pandas as pd
import dask.dataframe as dd
from dask.multiprocessing import get
और वाक्यविन्यास है
data = <your_pandas_dataframe>
ddata = dd.from_pandas(data, npartitions=30)
def myfunc(x,y,z, ...): return <whatever>
res = ddata.map_partitions(lambda df: df.apply((lambda row: myfunc(*row)), axis=1)).compute(get=get)
(मेरा मानना है कि यदि आपके पास 16 कोर हैं तो 30 उपयुक्त विभाजन है)। पूर्णता के लिए, मैंने अपनी मशीन (16 कोर) पर अंतर समयबद्ध किया:
data = pd.DataFrame()
data['col1'] = np.random.normal(size = 1500000)
data['col2'] = np.random.normal(size = 1500000)
ddata = dd.from_pandas(data, npartitions=30)
def myfunc(x,y): return y*(x**2+1)
def apply_myfunc_to_DF(df): return df.apply((lambda row: myfunc(*row)), axis=1)
def pandas_apply(): return apply_myfunc_to_DF(data)
def dask_apply(): return ddata.map_partitions(apply_myfunc_to_DF).compute(get=get)
def vectorized(): return myfunc(data['col1'], data['col2'] )
t_pds = timeit.Timer(lambda: pandas_apply())
print(t_pds.timeit(number=1))
28.16970546543598
t_dsk = timeit.Timer(lambda: dask_apply())
print(t_dsk.timeit(number=1))
2.708152851089835
t_vec = timeit.Timer(lambda: vectorized())
print(t_vec.timeit(number=1))
.010668013244867325
पांडा से जाने वाले 10 स्पीडअप का एक कारक देते हुए विभाजन पर डस्क लागू होते हैं। बेशक, यदि आपके पास एक फ़ंक्शन है जिसे आप वेक्टर कर सकते हैं, तो आपको चाहिए - इस मामले में फ़ंक्शन ( y*(x**2+1)
) तुच्छ रूप से वेक्टरीकृत है, लेकिन ऐसी बहुत सी चीजें हैं जो वेक्टर करना असंभव हैं।