同じ「10:00〜11:00 の範囲のログを抽出する」という課題を、標準ライブラリの bisect とデータ分析ライブラリの pandas で書き比べてみましょう。
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),
]
# 範囲指定
start_time = datetime(2025, 11, 29, 10, 0)
end_time = datetime(2025, 11, 29, 11, 0)
# bisectでインデックスを取得
start_idx = bisect.bisect_left(logs, start_time)
end_idx = bisect.bisect_right(logs, end_time)
subset = logs[start_idx:end_idx]
print("対象範囲:")
for log in subset:
print(log.strftime("%Y-%m-%d %H:%M"))
Python実行結果
対象範囲:
2025-11-29 10:00
2025-11-29 10:30
2025-11-29 11:00
- 特徴: 軽量で高速。ソート済みリストから範囲を抜き出すだけなら最適。
- 制約: リストがソート済みである必要がある。ラベルや複雑条件は扱いにくい。
pandas を使った場合(DataFrame)
import pandas as pd
# DataFrameにログを格納
df = pd.DataFrame({
"timestamp": pd.date_range("2025-11-29 09:00", periods=6, freq="30min"),
"event": ["start", "check", "error", "check", "end", "cleanup"]
})
# 範囲指定
start_time = pd.Timestamp("2025-11-29 10:00")
end_time = pd.Timestamp("2025-11-29 11:00")
# betweenで範囲抽出
subset = df[df["timestamp"].between(start_time, end_time)]
print(subset)
Python実行結果
timestamp event
2 2025-11-29 10:00:00 error
3 2025-11-29 10:30:00 check
4 2025-11-29 11:00:00 end
- 特徴:
betweenで直感的に書ける。複数列や複雑条件も簡単に組み合わせ可能。 - 制約: pandas をインポートする必要があり、小規模データではオーバーエンジニアリングになることも。
並べて比較
| 項目 | bisect | pandas |
|---|---|---|
| データ構造 | ソート済みリスト | DataFrame(表形式) |
| コード量 | インデックス計算+スライス | between で一行 |
| 適用範囲 | 単純な範囲検索 | 複数列・複雑条件検索 |
| データ規模 | 小〜中規模 | 中〜大規模 |
| 可読性 | Python標準で軽量 | データ分析に最適で直感的 |
まとめ
- bisect: 軽量で高速。ソート済みリストから範囲を抜き出すだけなら最適。
- pandas: 大規模データや複雑な条件検索に強い。ログ解析や時系列データ処理に便利。
👉 小規模・単純検索 → bisect
👉 大規模・複雑検索 → pandas


