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