「20〜40 の範囲の値を抽出する」という同じ課題を、標準ライブラリの bisect とデータ分析ライブラリの pandas で書き比べてみましょう。
bisect を使った場合(標準ライブラリ)
import bisect
data = [10, 15, 20, 25, 30, 35, 40, 45, 50] # ソート済みリスト
lower, upper = 20, 40
# 範囲の開始位置と終了位置を取得
start = bisect.bisect_left(data, lower)
end = bisect.bisect_right(data, upper)
# 範囲抽出
subset = data[start:end]
print(subset) # [20, 25, 30, 35, 40]
Python- 特徴: 軽量で高速。ソート済みリストから範囲を抜き出すだけなら最適。
- 制約: リストがソート済みである必要がある。ラベルや複雑な条件は扱いにくい。
pandas を使った場合(DataFrame)
import pandas as pd
data = pd.DataFrame({"value": [10, 15, 20, 25, 30, 35, 40, 45, 50]})
# between を使って範囲抽出
subset = data[data["value"].between(20, 40)]
print(subset)
Python実行結果
value
2 20
3 25
4 30
5 35
6 40
- 特徴:
betweenで直感的に書ける。複数列や複雑条件も簡単に組み合わせ可能。 - 制約: pandas をインポートする必要があり、小規模データではオーバーエンジニアリングになることも。
並べて比較
| 項目 | bisect | pandas |
|---|---|---|
| コード量 | やや多い(インデックス計算+スライス) | 短く直感的(between) |
| 必要条件 | ソート済みリスト | DataFrame(表形式) |
| 適用範囲 | 単純な範囲検索 | 複雑条件・複数列検索 |
| データ規模 | 小〜中規模 | 中〜大規模 |
| 可読性 | Python標準でシンプル | データ分析に最適で読みやすい |
まとめ
- bisect: 軽量で高速。ソート済みリストから範囲を抜き出すだけなら最適。
- pandas: 大規模データや複雑な条件検索に強い。ログ解析や時系列データ処理に便利。
👉 小規模・単純検索 → bisect
👉 大規模・複雑検索 → pandas


