スポンサーリンク
Python

📊 Pandas vs Polars:CSV書き込み速度を比較してみた(10万〜1000万行)

Python
この記事は約5分で読めます。

前回の記事では、Pandas と Polars の CSV 読み込み速度を比較し、Polars が非常に高速であることを確認しました。

今回はその続編として、CSV の書き込み速度(保存速度)を比較します。 実務では「読み込み → 前処理 → 書き込み」という流れが一般的なので、書き込み性能も無視できません。

🧪 検証内容

  • 比較対象:Pandas vs Polars
  • 書き込み形式:CSV(圧縮なし)
  • 行数:100,000 / 1,000,000 / 10,000,000
  • 各ケース 3 回実行し平均値を採用
  • データ構造:整数・浮動小数・文字列の3列

🧵 使用したソースコード(全文)

以下が今回のベンチマークに使用したコードです。 そのまま実行すれば同じ検証ができます。

import time
import pandas as pd
import polars as pl
from pathlib import Path

def create_data(n_rows: int):
    return pd.DataFrame({
        "id": range(n_rows),
        "value_float": [i * 0.1 for i in range(n_rows)],
        "value_str": [f"text_{i}" for i in range(n_rows)],
    })

def benchmark_write_csv(n_rows: int, repeat: int = 3):
    print(f"\n=== {n_rows:,} 行の書き込みベンチマーク ===")

    df_pd = create_data(n_rows)
    df_pl = pl.DataFrame(df_pd)

    out_dir = Path("benchmark_output")
    out_dir.mkdir(exist_ok=True)

    def timeit(func):
        times = []
        for _ in range(repeat):
            start = time.perf_counter()
            func()
            end = time.perf_counter()
            times.append(end - start)
        return sum(times) / len(times)

    # Pandas
    pd_path = out_dir / f"pandas_{n_rows}.csv"
    pd_time = timeit(lambda: df_pd.to_csv(pd_path, index=False))

    # Polars
    pl_path = out_dir / f"polars_{n_rows}.csv"
    pl_time = timeit(lambda: df_pl.write_csv(pl_path))

    print(f"Pandas: {pd_time:.4f} 秒")
    print(f"Polars: {pl_time:.4f} 秒")

    return {
        "rows": n_rows,
        "pandas": pd_time,
        "polars": pl_time,
    }

if __name__ == "__main__":
    results = []
    for n in [100_000, 1_000_000,10_000_000]:
        res = benchmark_write_csv(n)
        results.append(res)

    print("\n=== まとめ ===")
    for r in results:
        print(
            f"{r['rows']:,} 行 | Pandas: {r['pandas']:.4f} 秒 | "
            f"Polars: {r['polars']:.4f} 秒 | 比率(Pandas/Polars): {r['pandas']/r['polars']:.2f} 倍"
        )

実行結果

=== 100,000 行の書き込みベンチマーク ===
Pandas: 0.1064 秒
Polars: 0.0062 秒

=== 1,000,000 行の書き込みベンチマーク ===
Pandas: 1.0853 秒
Polars: 0.0250 秒

=== 10,000,000 行の書き込みベンチマーク ===
Pandas: 10.9350 秒
Polars: 0.2894 秒

=== まとめ ===
100,000 行 | Pandas: 0.1064 秒 | Polars: 0.0062 秒 | 比率(Pandas/Polars): 17.17 倍
1,000,000 行 | Pandas: 1.0853 秒 | Polars: 0.0250 秒 | 比率(Pandas/Polars): 43.46 倍
10,000,000 行 | Pandas: 10.9350 秒 | Polars: 0.2894 秒 | 比率(Pandas/Polars): 37.78 倍

📊 実行結果

あなたの実測値を表にまとめるとこうなります。

行数PandasPolars比率(Pandas / Polars)
100,0000.1064 秒0.0062 秒17.17 倍
1,000,0001.0853 秒0.0250 秒43.46 倍
10,000,00010.9350 秒0.2894 秒37.78 倍

🔍 考察

● Polars は書き込みでも圧倒的に高速

100万行で 43倍、1000万行でも 38倍という差は驚異的です。

● 行数が増えるほど Polars の強みが出る

Polars は Rust ベースでマルチスレッドを活かせるため、大規模データで特に強い。

● Pandas は単スレッドのため伸びにくい

CPU コア数を活かしきれず、行数が増えるほど処理時間が線形に増加。

● 1000万行を 0.3 秒で書き出す Polars

ETL やバッチ処理の高速化に直結するレベルの性能差。

📝 まとめ

  • 前回の「読み込み速度」に続き、今回の「書き込み速度」でも Polars が圧勝
  • 特に 100 万行以上の大規模データで差が顕著
  • ETL・ログ処理・バッチ処理など、書き込みが多いワークロードでは Polars が非常に有力
  • Pandas との併用(読み込みは Pandas、書き込みは Polars)も現実的な選択肢

コメント

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