Python 大量リストから一意なデータを高速に取得する方法
はじめに
Pythonで大量のリストから一意なIDを基準にデータを取得する際、
データ量が増えるとパフォーマンスが大きく低下することがあります。
そのような課題を解決した方法を記載します。
課題
例えば、以下のように一意なIDを条件にリストを絞り込むコードでは、
大量データの場合にパフォーマンスが大きく低下することがあります。
target_id = "{id}"
results = [] # 対象リスト
result = [x for x in results if x.id == target_id]
リスト内のすべての要素をチェックするため、サイズが大きいほど処理時間が長くなります。
解決策①: リストの形式を変更できない場合
リストの形式を変更できない場合、nextを使用すれば効率的に最初の一致するデータを取得できます。
result = next((x for x in results if x.id == target_id), None)
- 条件に一致する最初の要素だけを返すため、無駄なループを削減できます
- 条件に一致するデータがない場合は None を返します
解決策②: リストデータを辞書形式に変換できる場合
リストデータを辞書形式に変換できる場合、一意なIDをキーにすることで、
パフォーマンスを大幅に向上させることができます。
# 辞書型に変換
results_dict = {x.id: x for x in results}
# 辞書型からデータを取得
result = results_dict.get(target_id)
- 辞書型の検索はキーアクセスで行われるため、リスト検索に比べてパフォーマンスが向上します
- 辞書化自体のコストはありますが、同じリストデータに対して複数回検索を行う場合はパフォーマンスが向上します
結果
リストデータ数やループ回数の詳細は失念しましたが、以下のようなパフォーマンスの改善を確認しました。
- 解決案②
- 適用前:0.7秒
- 適用後:0.0015秒
この方法を活用することで、一意なIDを持つリストの取得パフォーマンスを向上させることができます。