达拉斯比熊猫更糟糕的表现

时间:2019-06-18 14:00:30

标签: pandas performance dask

我正在使用Pandas API和Dask API运行相同的功能。 我期望Dask API更快,但事实并非如此。

功能

我通过“分组”列交叉连接2个数据帧(分别是熊猫和dask),然后在每对上计算2个字符串之间的Levensthein距离。
结果是预期的,但我担心性能。

熊猫

@timeit
def pd_fuzzy_comparison(df1:DF, df2:DF, group_col:str, compare):

    df = df1.merge(df2, on=bubble_col, suffixes=('_internal', '_external'))

    df['score'] = df.apply(lambda d: 
            comp(d.company_norm_internal, d.company_norm_external), axis=1)
    return df

黄昏

@timeit
def dd_fuzzy_comparison(dd1:dd, dd2:dd, group_col:str, compare):

    ddf = dd1.merge(dd2, on='city_norm', suffixes=('_internal', '_external'))   
    ddf['score'] = ddf.apply(
            lambda d: ratio(d.company_norm_internal, d.company_norm_external), axis=1)

    return ddf.compute()

主要

import multiprocessing
CORES = multiprocessing.cpu_count()

results = pd_fuzzy_comparison(
                df1=internal_bubbles.copy(), 
                df2=external_bubbles.copy(), 
                bubble_col='city_norm',
                compare=ratio ) 

ddata1 = dd.from_pandas(internal_bubbles.copy(), npartitions=CORES)
ddata2 = dd.from_pandas(external_bubbles.copy(), npartitions=CORES)

ddresults = dd_fuzzy_comparison(
                dd1=ddata1.copy(), dd2=ddata2.copy(), 
                bubble_col='city-norm',                 
                compare=ratio)

输出

'pd_fuzzy_comparison'  1122.39 ms
'dd_fuzzy_comparison'  1717.83 ms

我想念什么?
谢谢!

1 个答案:

答案 0 :(得分:0)

首先,达斯克并不总是比熊猫快。如果熊猫为您工作,那么您应该坚持下去。

https://docs.dask.org/en/latest/best-practices.html#start-small

在特定情况下,您正在使用df.apply方法,该方法将Python用于循环,无论如何都会变慢。它还受GIL约束,因此您将需要选择使用进程的调度程序,例如dask.distributed或多处理调度程序。

https://docs.dask.org/en/latest/scheduling.html