0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】PolarsとPandasの比較結果

0
Posted at

データ分析の世界で長年スタンダードとして君臨してきた 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への移行は、単なる「高速化」だけでなく「リソースの有効活用」という面でも極めて強力なメリットがあると言えます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?