在DASK中,如何使简单函数的最大,均值和数据选择比PANDAS运行得更快?

时间:2019-02-17 15:47:50

标签: python pandas dask

最近,我正在学习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

1 个答案:

答案 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更快,更易于使用。尽管“大数据”工具令人兴奋,但它们总是比普通数据工具差,而它们仍然适用。