日々精進

新しく学んだことを書き留めていきます

DataFrameの処理を並列化すると非常に遅くなることがある

例えば、以下のようにグループ毎に集計する処理の場合

sums: DataFrame = train.groupby(ids)[SALES_COUNT].sum()

以下のようにするとグループ単位で並列化できるので速くなりそうに思える。

def func(df):
    return df[SALES_COUNT].sum()
ret_list: List = Parallel(n_jobs=cpu_count, backend="threading")(delayed(func)(group) for name, group in df.groupby(group_id))

が、実際計測してみると並列化しない場合は60秒、並列化した場合が3300秒と60倍近く並列化しない方が速かった。 想像だが、原因は以下かも。。

  • pythonの並列処理はマルチプロセスであり、各プロセスにデータのコピーを配るので余計時間がかかった
  • 並列化後のコードはapplyのようにグループ毎に関数を実行していくのでapplyが遅いのと同じ理由で遅くなったのかも

本当のところは分からないが、こんなに差が付くとは。。pythonムズカシイ