gpt4 book ai didi

python - 为什么 pandas.groupby.mean 比并行实现快得多

转载 作者:太空宇宙 更新时间:2023-11-04 04:20:49 24 4
gpt4 key购买 nike

我在一个非常大的数据集上使用 pandas grouby 均值函数,如下所示:

import pandas as pd
df=pd.read_csv("large_dataset.csv")
df.groupby(['variable']).mean()

看起来函数没有使用多处理,因此,我实现了一个并行版本:

import pandas as pd 
from multiprocessing import Pool, cpu_count

def meanFunc(tmp_name, df_input):
df_res=df_input.mean().to_frame().transpose()
return df_res

def applyParallel(dfGrouped, func):
num_process=int(cpu_count())
with Pool(num_process) as p:
ret_list=p.starmap(func, [[name, group] for name, group in dfGrouped])
return pd.concat(ret_list)

applyParallel(df.groupby(['variable']), meanFunc)

但是,pandas 的实现似乎仍然比我的并行实现快方式

我正在查看 source code对于 pandas groupby,我看到它正在使用 cython。是这个原因吗?

def _cython_agg_general(self, how, alt=None, numeric_only=True,
min_count=-1):
output = {}
for name, obj in self._iterate_slices():
is_numeric = is_numeric_dtype(obj.dtype)
if numeric_only and not is_numeric:
continue

try:
result, names = self.grouper.aggregate(obj.values, how,
min_count=min_count)
except AssertionError as e:
raise GroupByError(str(e))
output[name] = self._try_cast(result, obj)

if len(output) == 0:
raise DataError('No numeric types to aggregate')

return self._wrap_aggregated_output(output, names)

最佳答案

简答 - 使用 dask如果你想要并行处理这些类型的案例。你的方法中有它避免的陷阱。它可能仍然不会更快,但会给你最好的机会,并且在很大程度上是 pandas 的直接替代品。

更长的答案

1) 并行性本质上会增加开销,因此理想情况下,您要并行化的操作会有些昂贵。添加数字并不是特别重要 - 你是对的,这里使用了 cython,你正在查看的代码是调度逻辑。实际的核心cython是here ,这转化为一个非常简单的 C 环。

2) 您正在使用多处理 - 这意味着每个进程都需要获取数据的副本。这很贵。由于 GIL,通常你必须在 python 中执行此操作 - 你实际上可以(dask 确实)在这里使用线程,因为 pandas 操作在 C 中并释放 GIL。

3) 正如@AKX 在评论中指出的那样 - 并行化之前的迭代 (... name, group in dfGrouped) 也相对昂贵 - 它为每个组构建新的子数据帧。原始的 pandas 算法迭代就地数据。

关于python - 为什么 pandas.groupby.mean 比并行实现快得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54514979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com