データ分析の世界で長年スタンダードとして君臨してきた Pandas。しかし近年、その「処理速度」や「メモリ消費」の課題を解決する救世主として Polars が急速に普及しています。
今回は、これら2つのライブラリの特徴と、実際のベンチマーク結果に基づいた性能差を解説します。
1. Pandasとは?
Pythonでのデータ分析において最も有名なライブラリです。R言語のようなデータフレーム操作をPythonに持ち込み、データサイエンスの発展を支えてきました。
メリット:
圧倒的な知名度と情報量: 困ったときに検索すれば、ほぼ確実に解決策が見つかります。
エコシステムの充実: Matplotlib(可視化)やScikit-learn(機械学習)など、他の多くのライブラリと親和性が高いです。
柔軟性: 柔軟なインデックス操作や、時系列データの処理に非常に長けています。
デメリット:
シングルスレッド動作: CPUの1コアしか使わないため、マルチコアCPUの恩恵を受けられません。
メモリ効率: 実データの数倍のメモリを消費することがあり、大規模データでは「Memory Error」が発生しやすいです。
2. Polarsとは?
Rust言語で開発された、モダンなデータフレームライブラリです。「高速であること」と「メモリ効率が良いこと」を最優先に設計されています。
メリット:
爆速の並列処理: デフォルトでマルチスレッド動作するため、マルチコアCPUの性能を限界まで引き出します。
遅延評価(Lazy API): 処理を即座に実行せず、最適な実行プランを立ててから動くため、無駄な計算やメモリ消費を省けます。
Apache Arrow採用: メモリ効率の高いフォーマットを採用しており、データの読み書きが極めて高速です。
デメリット:
学習コスト: Pandasとは文法(メソッドチェーン等)が異なるため、慣れが必要です。
ライブラリ連携: Pandasほど周辺ライブラリとの直接連携がスムーズでない場合があります(ただし、変換は容易です)。
1.単純なCSV読み込み
条件
- 10回繰り返し実行し、その平均処理速度を計測
- test.csv:rows=10000000 cols=10 size=699574 KB
実装例
# polarsの場合
import polars as pl
pl.read_csv('test.csv')
# pandasの場合
import pandas as pd
pd.read_csv('test.csv')
比較結果
| 項目 | Pandas | Polars | Polarsの優位性 |
|---|---|---|---|
| 平均処理速度(sec) | 8.475401 | 0.339956 | 約 25倍 高速 |
| 最大メモリ使用率(MB) | 4750.09 | 4144.96 | 約 13% 削減 |
考察:並列処理の暴力
Pandasがシングルスレッドで逐次処理を行うのに対し、PolarsはRust言語によるマルチスレッド処理をフル活用します。その結果、読み込みだけで25倍もの速度差が生まれています。
2.CSV読み込み→filterによるレコードの絞り込み
条件
- 10回繰り返し実行し、その平均処理速度を計測
- test.csv:rows=10000000 cols=10 size=699574 KB
- 絞り込み:10000000 records → 874498 records
- polars特有のLayzFrameでの検証も追加
実装例
# polars(read_csv)の場合
import polars as pl
df = pl.read_csv('test.csv')
df = df.filter(pl.col("col3") == "gamma")
# polars(scan_csv)の場合
df = pl.scan_csv('test.csv')
df = df.filter(pl.col("col3") == "gamma").collect()
# pandasの場合
import pandas as pd
df = pd.read_csv('test.csv')
df = df[df["col3"] == "gamma"]
比較結果
| 項目 | Pandas | Polars(read_csv) | Polars(scan_csv) |
|---|---|---|---|
| 平均処理速度(sec) | 9.301130 | 0.376668 | 0.477845 |
| 最大メモリ使用率(MB) | 3375.42 | 2835.33 | 1569.67 |
考察:Lazy API (scan_csv) の真価
-
速度の逆転現象 :
scan_csv はクエリ最適化のオーバーヘッドがあるため、この程度のデータサイズでは read_csv の方が僅かに高速だが、おそらくデータsizeがさらに増加するとscan_csvの方が速くなりそう。 -
メモリ効率の劇的向上 :
最も注目すべきは scan_csv のメモリ使用量です。read_csv は一度全データをメモリに載せますが、scan_csv は 「述語プッシュダウン(Predicate Pushdown)」 により、フィルタリング条件を読み込み段階に適用します。その結果、メモリ消費をPandasの半分以下、Polars(read)の約60%まで抑制できています。
まとめ
検証結果から、Polarsを使用する上での明確な使い分けが見えてきました。
速度最優先なら read_csv データがメモリに余裕で収まるサイズであれば、Eager実行(即時実行)が最速のパフォーマンスを発揮します。
メモリ節約・安定性なら scan_csv (Lazy API) 大規模データやメモリ制限のある環境では、Lazy APIが必須です。「必要なデータだけを読み込む」最適化により、処理のクラッシュ(OOM)を回避しつつ、Pandasより遥かに高速に動作します。
結論:
現代のデータ処理において、PandasからPolarsへの移行は、単なる「高速化」だけでなく「リソースの有効活用」という面でも極めて強力なメリットがあると言えます。