こんにちは。
野中やすおです。
今回の記事では、効率性を向上させるPythonコードのリファクタリングにおいてエラーチェックロジックを改善した話について書こうと思います。
今いる現場で自分がレビュー依頼をしていたPRについて、レビュアーがより良いコードを提案してくれたので自分への戒め?も込めて残しておきます。
エラーチェックロジック
当初のロジック
今回実装の対象となったコードは、CSVファイルをアップロードした際に、ユーザーの氏名とメールアドレスが一致しない場合は、一致しない行のエラーを404として投げるというエラーチェックロジックを実装していました。
エラーチェックロジックとして私は当初以下のような実装を行なっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 氏名とメールアドレスが一致しない場合、エラーを投げる error_indices = [] for index, row in target_df.iterrows(): user = next((u for u in users if u.email == row[email_column.value]), None) if user and user.name != row[email_column.value]: error_indices.append(index) if error_indices: lines = ", ".join(str(index) for index in error_indices) raise HTTPException(status_code=404, detail=f"Invalid at rows: {lines}") return users |
Pythonのnextメソッドを使用して二重ループにし、検索方法を線形探索にしていました。
提案されたロジック
提案されたロジックは以下のようにユーザーのリストを辞書に変換することものでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
error_indices = [] for index, row in target_df.iterrows(): email = str(row[email_column]) user = users_dict.get(email) if user and user.name != row[name_column]: error_indices.append(index) if error_indices: lines = ", ".join(str(index) for index in error_indices) raise HTTPException(status_code=404, detail=f"Invalid at rows: {lines}") return users |
これによって、メールアドレスからユーザーを探す処理が効率化されました。つまり、辞書を使用することで、検索方法は修正前の線形探索からハッシュ探索になりパフォーマンスも向上しました。
以上、エラーチェックロジックの改善の話でした。今後もより良いコードを書くように意識できればと思っています!