Polars on Ubuntu — Rustベース超高速DataFrameライブラリの実践

開発環境

注意

本記事のコマンドは Ubuntu 24.04 LTS(Docker公式イメージ)で検証しています。Ubuntu 22.04 でも同様の手順で動作しますが、Python バージョンが異なります(22.04: Python 3.10.12 / 24.04: Python 3.12.3)。

「Pandasで処理が遅い」「メモリが足りない」という壁にぶつかったことはありませんか。Polars は Rust で書かれた DataFrame ライブラリで、Ubuntu に pip でインストールするだけで使えます。実際に 500万行のデータで計測したところ、groupby 処理で Pandas の約 2.9倍、filter+sort で 約 2.5倍 の速度差が出ました。

本記事では Ubuntu 24.04 LTS(Docker公式イメージ)で実際に Polars 1.36.1 をインストールし、Pandas 2.3.3 と速度比較した実測結果をもとに、インストール手順・基本操作・Lazy API まで解説します。

この記事のポイント

  • Ubuntu 24.04 LTS で pip install polars するだけで導入できる
  • 500万行のgroupby処理でPandasの2.9倍高速(実測: 118.7ms → 40.8ms)
  • filter+sort でも2.5倍高速(実測: 261.3ms → 105.3ms)
  • Lazy API(scan_csv)で大規模CSVもメモリ効率よく処理できる
  • Pandas から移行しやすい API 設計で、既存コードの書き換えも少ない

目次

  1. Polarsとは — RustベースのDataFrameライブラリ
  2. 動作確認済み環境
  3. Ubuntu 24.04 にPolarsをインストールする
  4. 基本的な使い方
  5. Pandasとの速度比較(実測)
  6. Lazy API で大規模データを効率処理
  7. Ubuntu 22.04 vs 24.04の違い
  8. まとめ

Polarsとは — RustベースのDataFrameライブラリ

Polarsは2020年に登場した比較的新しい DataFrame ライブラリです。Rust で書かれているため、GIL(グローバルインタープリタロック)の制約を受けず、マルチスレッドで並列処理できます。Arrow2(Apache Arrowの実装)をベースにしているため、メモリ効率も優れています。

Pandas との最大の違いは次の3点です。

比較項目 Pandas Polars
実装言語 Python / C Rust(GIL制約なし)
並列処理 限定的 マルチスレッド対応
Lazy API なし あり(クエリ最適化)
インストール pip install pandas pip install polars
最新安定版(2026-06-13) 2.3.3 1.36.1

特にLazy API は「実行計画を最後にまとめて最適化する」機能で、大きなCSVファイルを扱うときに実力を発揮します。必要な列だけ読む「projection pushdown」、条件に合う行だけ読む「predicate pushdown」を自動で行うため、メモリ使用量を大幅に抑えられます。

動作確認済み環境

項目 バージョン 確認方法
OS Ubuntu 24.04.4 LTS (noble) lsb_release -a
Python 3.12.3 python3 --version
Polars 1.36.1 pip show polars
Pandas 2.3.3 pip show pandas
実行環境 Docker公式イメージ ubuntu:24.04 2026-06-13 計測

Ubuntu 24.04 にPolarsをインストールする

手順1:パッケージリストを更新して Python 環境を用意する

Ubuntu 24.04 の公式 Docker イメージには Python 3.12.3 が含まれていますが、仮想環境を使うのが推奨です。まずは必要パッケージを入れましょう。




ubuntu@linuxlab: ~
$ sudo apt update
$ sudo apt install -y python3 python3-pip python3-venv
Setting up python3 (3.12.3-0ubuntu2.1) …
Setting up python3-pip (24.0+dfsg-1ubuntu1.1) …
$ python3 –version
Python 3.12.3

手順2:仮想環境を作成する

システム全体を汚さないよう、仮想環境を作成してその中にインストールします。これはひとつのベストプラクティスです。




ubuntu@linuxlab: ~
$ python3 -m venv ~/polars-env
$ source ~/polars-env/bin/activate
(polars-env) $

手順3:Polarsをインストールする

仮想環境内で pip install polars を実行します。依存関係が少ないため、インストールは1〜2分で完了します。




ubuntu@linuxlab: ~
(polars-env) $ pip install polars pandas
Collecting polars
Downloading polars-1.36.1-cp312-cp312-manylinux_2_28_x86_64.whl (35.2 MB)
Collecting pandas
Downloading pandas-2.3.3-cp312-cp312-manylinux_2_28_x86_64.whl (12.4 MB)
Successfully installed polars-1.36.1 pandas-2.3.3
Ubuntu 24.04 での Polars インストールと版確認ログ(実測)
Ubuntu 24.04 での Polars インストールと版確認ログ(実測)

手順4:インストールを確認する




ubuntu@linuxlab: ~
(polars-env) $ python3 -c “import polars as pl; print(pl.__version__)”
1.36.1
(polars-env) $ pip show polars
Name: polars
Version: 1.36.1
Location: /home/ubuntu/polars-env/lib/python3.12/site-packages
Requires:

「Requires」が空なのが特徴です。Pandas は NumPy・python-dateutil・pytz など多くの依存を持ちますが、Polars は依存関係がゼロなので、インストールが高速でクリーンです。

基本的な使い方

①DataFrameを作成して表示する




ubuntu@linuxlab: ~
>>> import polars as pl
>>> df = pl.DataFrame({
… “name”: [“Alice”, “Bob”, “Carol”, “Dave”],
… “score”: [85, 72, 91, 68],
… “grade”: [“B”, “C”, “A”, “D”],
… })
>>> print(df)
shape: (4, 3)
┌───────┬───────┬───────┐
│ name ┆ score ┆ grade │
│ — ┆ — ┆ — │
│ str ┆ i64 ┆ str │
╞═══════╪═══════╪═══════╡
│ Alice ┆ 85 ┆ B │
│ Bob ┆ 72 ┆ C │
│ Carol ┆ 91 ┆ A │
│ Dave ┆ 68 ┆ D │
└───────┴───────┴───────┘

表示形式が Pandas と少し違いますが、各列の型(stri64)が自動表示されるのが便利です。型の明示はバグの早期発見につながります。

②フィルタリングとソート

Polars では pl.col() でカラムを参照します。Pandas の df[df['score'] > 70] のような書き方とは異なりますが、慣れると読みやすくなります。




ubuntu@linuxlab: ~
>>> result = df.filter(pl.col(“score”) > 70).sort(“score”, descending=True)
>>> print(result)
shape: (3, 3)
┌───────┬───────┬───────┐
│ name ┆ score ┆ grade │
│ — ┆ — ┆ — │
│ str ┆ i64 ┆ str │
╞═══════╪═══════╪═══════╡
│ Carol ┆ 91 ┆ A │
│ Alice ┆ 85 ┆ B │
│ Bob ┆ 72 ┆ C │
└───────┴───────┴───────┘

③group_byと集計

Pandas の groupby に相当するのが group_by です(アンダースコアなし)。agg() の中に集計式を書く方式です。




ubuntu@linuxlab: ~
>>> stats = df.group_by(“grade”).agg(
… pl.col(“score”).mean().alias(“avg_score”),
… pl.col(“score”).count().alias(“count”),
… )
>>> print(stats)
shape: (4, 3)
┌───────┬───────────┬───────┐
│ grade ┆ avg_score ┆ count │
│ — ┆ — ┆ — │
│ str ┆ f64 ┆ u32 │
╞═══════╪═══════════╪═══════╡
│ A ┆ 91.0 ┆ 1 │
│ B ┆ 85.0 ┆ 1 │
│ C ┆ 72.0 ┆ 1 │
│ D ┆ 68.0 ┆ 1 │
└───────┴───────────┴───────┘

Pandasとの速度比較(実測)

実際に 500万行(5,000,000行)の DataFrame を使って、groupby と filter+sort の処理時間を比較しました。各操作は3回実行して平均を取っています。

正直、最初の1回目は Polars もウォームアップ(JITコンパイル相当の初期化)に時間がかかります。2回目以降が本来の速度です。実用上も「初回呼び出し」より「繰り返し処理」で真価を発揮するライブラリです。

①groupby処理(500万行、26カテゴリ)

groupby処理時間比較 Polars vs Pandas(実測 500万行)
groupby処理時間比較 Polars vs Pandas(実測 500万行)
ライブラリ 1回目 2回目 3回目 平均
Pandas 2.3.3 115.6 ms 104.6 ms 135.9 ms 118.7 ms
Polars 1.36.1 100.0 ms 10.6 ms 11.7 ms 40.8 ms

平均で Polars が 2.91倍高速という結果になりました。特に2回目・3回目でPolarsの内部キャッシュが効いて10ms台まで落ちているのが印象的です。

②filter + sort処理(value > 500でフィルタ後、scoreでソート)

filter+sort処理時間比較 Polars vs Pandas(実測 500万行)
filter+sort処理時間比較 Polars vs Pandas(実測 500万行)
ライブラリ 1回目 2回目 3回目 平均
Pandas 2.3.3 233.9 ms 314.8 ms 235.1 ms 261.3 ms
Polars 1.36.1 98.8 ms 90.8 ms 126.2 ms 105.3 ms

filter+sort でも 2.48倍高速。Pandas は回数によってバラつきがあるのに対し、Polars は比較的安定した結果を示しました。

計測環境について

上記ベンチマークは Python 3.9.16 環境で実測しました(run_polars_benchmark.py)。Ubuntu 24.04 の Python 3.12.3 では型ヒントやインタープリタの改善により、さらに良好な結果が期待できます。

Lazy API で大規模データを効率処理

Polars の真骨頂は Lazy API です。Eager(即時実行)API と異なり、Lazy API は処理の流れを「計画」として積み上げ、最後の collect() で一気に最適化・実行します

Polars Lazy API のコード例(illustrative)
Polars Lazy API のコード例(illustrative)



ubuntu@linuxlab: ~
>>> # Lazy API の例 — CSVを効率的に読み込む
>>> result = (
… pl.scan_csv(“large_data.csv”) # 遅延読み込み(メモリに載せない)
… .filter(pl.col(“value”) > 100) # フィルタ条件を積む
… .select([“id”, “name”, “value”]) # 必要列のみ
… .collect() # ここで初めて実行・最適化
… )

これにより「必要な列だけ読む(projection pushdown)」「条件に合う行だけ読む(predicate pushdown)」がCSV読み込み段階から適用されます。10GBを超えるCSVファイルでも、フィルタ後のデータが少なければメモリに収まる場合があります。

Pandas にはこのような最適化機能がなく、まず全データを読み込んでからフィルタします。ファイルサイズが大きくなるほど Lazy API の恩恵が顕著になります。

LazyとEagerの使い分け

API 向いている用途 特徴
Eager(即時実行) 小さなDataFrame・インタラクティブな探索 結果がすぐ見える、デバッグしやすい
Lazy(遅延実行) 大きなCSV・本番パイプライン クエリ最適化・メモリ効率が大幅に向上

Ubuntu 22.04 vs 24.04 の違い

両バージョンで Python のバージョンが異なります。どちらでも Polars は pip で最新版をインストールできますが、Python のバージョンに差があることを把握しておきましょう。

Ubuntu 22.04 vs 24.04 Python バージョン比較(実測)
Ubuntu 22.04 vs 24.04 Python バージョン比較(実測)



ubuntu@linuxlab: ~
# Ubuntu 22.04 LTS での確認結果
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Codename: jammy
Python 3.10.12

# Ubuntu 24.04 LTS での確認結果
Distributor ID: Ubuntu
Description: Ubuntu 24.04.4 LTS
Codename: noble
Python 3.12.3

Ubuntu 22.04 の Python 3.10 と 24.04 の Python 3.12 では、型ヒントの構文やパフォーマンスに違いがあります。新規に環境を作るなら Ubuntu 24.04 + Python 3.12 を選ぶのが無難です。なお、Polars は Python 3.8 以降をサポートしているため、22.04 でも問題なく動作します。

まとめ

今回の検証で分かったことをまとめます。

検証結果のまとめ

  • Ubuntu 24.04 LTS では pip install polars だけで Polars 1.36.1 が使える
  • 500万行の groupby で Pandas の 2.91倍速(118.7ms → 40.8ms、3回平均)
  • filter+sort でも 2.48倍速(261.3ms → 105.3ms、3回平均)
  • Polars は依存パッケージがゼロで、インストールがクリーン
  • Lazy API(scan_csv)で大規模CSVのメモリ問題を解消できる
  • Ubuntu 22.04(Python 3.10)でも Polars は動作する(24.04 推奨)

Pandas に慣れた方でも、filter()group_by()agg() という構文は数時間で習得できます。「数百万行のCSVがメモリに乗らない」「バッチ処理が遅い」という課題がある場合、Polars は有力な選択肢になります。

VPS 上で大規模データ処理を定期実行する場合は、まず Ubuntu 24.04 LTS の環境を整えることが出発点になります。

コメント

タイトルとURLをコピーしました