「key」という列で、形状がdf1.shape =(80000、18)の大きなパンダデータフレームを、形状がdf2.shape =(1、18)の小さなパンダデータフレームにマージしたいと思います。dd.mergeを使用した時間パフォーマンスは次のとおりです。
ddf1 = from_pandas(df1, npartitions=20)
ddf2 = from_pandas(df2, npartitions=1)
start = time.time()
pred_mldf = dd.merge(ddf1 , ddf2, on =['key'])
print(pred_mldf)
t0 = time.time()
print("deltat = ", t0 - start)
そして、結果はdeltat = 0.04です。
次に、この方法で遅延したdaskを使用してこれを実装し始めました。
def mymerge(df1, df2, key):
pred_mldf = pd.merge(df1, df2, on = key)
return pred_mldf
start = time.time()
pred_mldf = dask.delayed(mymerge)(df1, df2, ['key'])
pred_mldf.compute()
t0 = time.time()
print("deltat = ", t0 - start)
そして、結果はdeltat = 3.48です。
私の仮説は、2つのアプローチで同時にパフォーマンスを達成する必要があるというものです。私がここで間違っていることは何ですか?
@Nick Beckerがコメントで指摘したように、現在、最初のコードブロックはマージを定義するだけで、実行しません(2番目のコードブロックは実行します)。したがって、追加.compute()
すると別のマージ時間が与えられます。
ddf1 = from_pandas(df1, npartitions=20)
ddf2 = from_pandas(df2, npartitions=1)
start = time.time()
pred_mldf = dd.merge(ddf1 , ddf2, on =['key']).compute()
print(pred_mldf)
t0 = time.time()
print("deltat = ", t0 - start)
実行速度が異なるもう1つの理由は、2番目のコードブロックで完全df1
を遅延関数に渡すことです。df1
が大きい場合は、(最初のコードブロックのように)20のチャンクに分割し、それらを個別に遅延関数に渡す方が少し公平かもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加