実務では「まず軽量に範囲を絞る → その後詳細分析」という流れがよく使われます。ここでは bisect で前処理し、pandas で分析する一連のフローを例示します。
ステップ1: 前処理(bisect で範囲抽出)
まず大量ログから「対象時間帯」だけを効率的に切り出します。
import bisect
from datetime import datetime
# ソート済みのログタイムスタンプ(例)
logs = [
datetime(2025, 11, 29, 9, 0),
datetime(2025, 11, 29, 9, 30),
datetime(2025, 11, 29, 10, 0),
datetime(2025, 11, 29, 10, 30),
datetime(2025, 11, 29, 11, 0),
datetime(2025, 11, 29, 11, 30),
]
# 範囲指定(10:00〜11:00)
start_time = datetime(2025, 11, 29, 10, 0)
end_time = datetime(2025, 11, 29, 11, 0)
# bisectでインデックスを取得
s = bisect.bisect_left(logs, start_time)
e = bisect.bisect_right(logs, end_time)
# 対象範囲のログを抽出
filtered_logs = logs[s:e]
print(filtered_logs)
Python👉 この段階で「対象時間帯のログ」だけを軽量に取り出せる。
👉 大量ログでもメモリに収まる部分だけを pandas に渡せる。
ステップ2: 分析(pandas で詳細処理)
抽出したログにイベント情報やユーザー情報を紐付けて、複雑な条件で分析します。
import pandas as pd
# pandas DataFrame に変換(例: イベント付きログ)
df = pd.DataFrame({
"timestamp": filtered_logs,
"event": ["error", "check", "end"], # 仮のイベントデータ
"user": ["alice", "bob", "alice"]
})
# 範囲内の ERROR イベントを抽出
errors = df[df["event"] == "error"]
# ユーザー別に件数を集計
summary = errors.groupby("user").size().reset_index(name="count")
print(summary)
Python実行結果例
user count
0 alice 1
👉 pandas で「範囲内の ERROR をユーザー別に集計」といった複雑な分析が簡単にできる。
フローのメリット
- bisect: 軽量で高速 → 大量ログから対象範囲を効率的に切り出す
- pandas: 強力な分析機能 → 条件抽出・集計・統計処理を直感的に書ける
- 組み合わせ: 「前処理は軽量、分析は強力」という役割分担で効率的にログ解析が可能
まとめ
- リアルタイム処理や軽量抽出 → bisect
- 詳細分析や複雑条件 → pandas
- 実務では「bisect で対象範囲を絞り、pandas で分析」という二段構えが最適。


