👌
パフォーマンス、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