我正在使用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
我想念什么?
谢谢!
答案 0 :(得分:0)
首先,达斯克并不总是比熊猫快。如果熊猫为您工作,那么您应该坚持下去。
https://docs.dask.org/en/latest/best-practices.html#start-small
在特定情况下,您正在使用df.apply
方法,该方法将Python用于循环,无论如何都会变慢。它还受GIL约束,因此您将需要选择使用进程的调度程序,例如dask.distributed或多处理调度程序。