Polarsでは、concatはメモリコピーをして、vstackはメモリコピーをしないようです。
バージョン1.12.0で確かめてみました。
比較
16 x 16のdf1
をn
回結合してみます。
メモリコピーしていれば、結合回数の自乗で計算時間が増えていくはずです。
import numpy as np
import polars as pl
from timeit import timeit
df1 = pl.DataFrame(
np.arange(256).reshape(16, -1),
[f"col{i:02}" for i in range(16)],
)
concat_code = """\
df = df1
for _ in range(n):
df = pl.concat([df, df1])
"""
vstack_code = """\
df = df1
for _ in range(n):
df = df.vstack(df1)
"""
times = [1, 100, 200, 300, 400]
vstack_times = [
timeit(vstack_code, number=100, globals=locals())
for n in times
]
concat_times = [
timeit(concat_code, number=100, globals=locals())
for n in times
]
図からはわかりにくいですが、どちらも自乗で増えています。
また、vstackの方が速いですが、2倍くらいしか違いません。思ったほど違いません。
なお、結合だけならvstackの方が速いですが、このあと加工したときにvstackの方が遅いかもしれません。
私の結論
- (シビアな状況でなければ)どちらでも良さそう
- 気になるなら、計測してみればよい
以上