达克斯分组约会表现

时间:2018-07-17 07:30:34

标签: python pandas dask

给出以下dask数据框:

import numpy as np
import pandas as pd
import dask.dataframe as dd

N = int(1e4)
df = pd.DataFrame(np.random.randn(N, 3), columns=list('abc'),
                 index=pd.date_range(datetime.now(), periods=N, freq='1min'))
df['dt'] = pd.to_datetime(df.index.date)

ddf = dd.from_pandas(df, npartitions=5)
ddf

和这个缓慢的功能:

def f(grp, M=5):
    #A slow function
    x = 0
    for n in range(M):
        for idx1, row in grp[list('abc')].items():
            for idx2, v in row.items():
                x += v
    return x

令我惊讶的是,对于groupby +聚合操作而言,熊猫的速度要快于黄昏,例如:

%%timeit
res = ddf.groupby('dt').apply(f).compute()
#310 ms ± 3.08 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

与之相对:

%%timeit
res = df.groupby('dt').apply(f)
#149 ms ± 3.76 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

我在这里错过了什么吗?我以为dask可以并行化此计算?我的实际用例有数百万行,而聚合功能非常慢。

1 个答案:

答案 0 :(得分:0)

当数据放入存储器pandas的速度比dask快。我想知道您使用的是dask的哪个版本,因为如果不为应用声明元数据,它应该返回警告。 (您的问题已编辑,我添加了元数据。)

您可以尝试使用更大数量的N,使用不同数量的分区并使用多处理来运行这些实验。

%%timeit -n10
dask <= 0.17.5
res = ddf.groupby('dt').apply(f, meta=('x', 'f8'))\
         .compute(get=dask.multiprocessing.get)



%%timeit -n10
dask >= 0.18.0
res = ddf.groupby('dt').apply(f, meta=('x', 'f8'))\
         .compute(scheduler='processes')

对于笔记本电脑上的N=int(1e5)npartitions=4dask版本比pandas版本快。下一步将是尝试改善您的功能f