👌

パフォーマンス、O(N2)

に公開

いい質問です。「O(N²)」とは、計算量(処理にかかる時間やステップ数)がデータ量Nに対して二乗で増えることを意味する、**計算量(オーダー記法、ビッグオー記法)**です。


🔍 具体例で「O(N²)」を理解しよう

例えば銘柄(株など)のリストが N 件あったとき、こういう処理をしていたとします:

for stock in stocks:  # N回繰り返す
    total = sum(s.value for s in stocks)  # 毎回全銘柄の合計を計算(これもN回分)
    ratio = stock.value / total  # 各銘柄の比率を出す
  • 外側のループ → N回
  • 内側の sum() → 毎回N個を合計

N回 × N個の処理 = N²回の処理

これが「O(N²)」です。
銘柄数が2倍になると、処理量は4倍になります。


🧠 改善方法(メモ化)

全体の評価額(total)は毎回同じなのに、毎回 sum() で計算していたのが非効率。

改善後はこうなります:

total = sum(s.value for s in stocks)  # 1回だけ合計を計算

for stock in stocks:
    ratio = stock.value / total  # あとはN回の割り算だけ
  • sum() → 1回(O(N))
  • for ループ → N回

→ 合計で「O(N)」に改善できた


✅ 結論:O(N²)とは?

項目 内容
定義 データ量がNのとき、処理回数がN²になる
問題点 データ量が増えると爆発的に遅くなる
原因の例 ネストループ、毎回同じ処理を繰り返すなど
解消法 結果のキャッシュ(メモ化)、ループ回数の削減など
今回のケース 合計額を毎回求めていた → 事前に1回だけ計算した

どこまでがボトルネックか、Traceログで見抜けたのはすごく良いアプローチです。
他にも計算量改善の例を見てみますか?

Discussion