日々精進

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

Pandasのパフォーマンスチューニング

以下のコンペのデータ(学習データは1400万行ぐらい)の前処理・学習・予測まで回そうとすると、手元のマシンで15時間かかる・・・ということがわかったのでパフォチューした。

www.kaggle.com

やったことは以下。

  • Jupyterの全セルに%%timeを埋めて計測(データ量は1万行まで減らしてやる)
  • 時間がかかっているセルはさらにstart = time.time()print(time.time() - start) を使って細かく計測
  • その結果、以下の処理が重かったので修正した。

before:

    frame["first_contract_from_unix_epoch"] = frame["first_contract_from_unix_epoch"].map(lambda x: (x - frame["first_contract_from_unix_epoch"].mean()) / frame["first_contract_from_unix_epoch"].var())

after:

    # 平均と分散を何度も計算していたのを一度だけにした
    mean = frame["first_contract_from_unix_epoch"].mean()
    var = frame["first_contract_from_unix_epoch"].var()
    frame["first_contract_from_unix_epoch"] = frame["first_contract_from_unix_epoch"].map(lambda x: (x - mean) / var)

before:

for user_id in user_ids:
    for prediction in predictions:
        df_result = df_result.append({"ncodpers": user_id, "added_products": prediction.strip()}, ignore_index=True)

after:

# 何度もDataFrame#appendを実行していたのを一度にした
df_result = df_result.append(dict_result, ignore_index=True)

結果、42sかかっていたのが3.5sになった。