前回の記事では、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 倍📊 実行結果
あなたの実測値を表にまとめるとこうなります。
| 行数 | Pandas | Polars | 比率(Pandas / Polars) |
|---|---|---|---|
| 100,000 | 0.1064 秒 | 0.0062 秒 | 17.17 倍 |
| 1,000,000 | 1.0853 秒 | 0.0250 秒 | 43.46 倍 |
| 10,000,000 | 10.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)も現実的な選択肢


コメント