最近,我正在学习Dask,听说它比大熊猫有更高的存储效率和速度。
这可能会提高内存效率,但是简单的基准测试比起熊猫,给我提供了更快的速度。
问:如何提高任务速度?
以下是设置:
import numpy as np
import pandas as pd
import dask
import dask.dataframe as dd
import dask.array as da
import time
import seaborn as sns
df = sns.load_dataset('titanic')
df = df = pd.concat([df for _ in range(100)])
print(df.shape)
df.head(2)
def benchmark(func):
start = time.time()
func()
end = time.time()
print("{0:.4f} seconds for {1}".format((end - start), func.__name__))
ddf = dd.from_pandas(df,npartitions=8)
def get_mean():
return df['fare'].mean()
def get_mean_dask():
return ddf['fare'].mean().compute()
def get_max():
return df['fare'].max()
def get_max_dask():
return ddf['fare'].max().compute()
def get_sum():
return df['fare'].sum()
def get_sum_dask():
return ddf['fare'].sum().compute()
def get_filter():
return df[df['fare'] > 10.0]
def get_filter_dask():
return ddf[ddf['fare'] > 10.0].compute()
测试dask与pandas的对比
for i,func in enumerate([get_mean, get_mean_dask,
get_max, get_max_dask,
get_sum, get_sum_dask,
get_filter, get_filter_dask]):
benchmark(func)
if (i+1) %2 == 0:
print()
结果
0.0007 seconds for get_mean
0.0105 seconds for get_mean_dask
0.0006 seconds for get_max
0.0054 seconds for get_max_dask
0.0006 seconds for get_sum
0.0055 seconds for get_sum_dask
0.0022 seconds for get_filter
0.0438 seconds for get_filter_dask
答案 0 :(得分:2)
Dask会将开销增加到您正在执行的任何操作中,对于线程来说,每个任务50us 的量级对于分布式调度程序来说为0.5ms。单个计算可能包含许多任务。为了获得良好的并行性和速度,并且不让总时间由开销控制,您必须执行的任务比开销要长得多。这就是为什么Dask瞄准大数据或至少是中间数据的原因,对于数据帧,这可能意味着分区大小> 100MB。 (这是在考虑GIL和其他因素之前)
简而言之,尝试将Dask用于Pandas的总时间为ms或更短的时间是没有意义的。在熊猫效果很好的地方,请使用熊猫。
来自 http://docs.dask.org/en/latest/dataframe-performance.html:
对于适合RAM的数据,Pandas通常比Dask DataFrame更快,更易于使用。尽管“大数据”工具令人兴奋,但它们总是比普通数据工具差,而它们仍然适用。