给出以下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可以并行化此计算?我的实际用例有数百万行,而聚合功能非常慢。
答案 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=4
,dask
版本比pandas
版本快。下一步将是尝试改善您的功能f
。