今回はPandasを高速化させられる
互換ライブラリ「FireDucks」を試してみました。
解説動画はこちら
Fireducksについて
早速速度を試してみましょう。
インストール方法
インストールコマンドを実行するだけです。
読み込み方
import文を実行するだけで
読み込み出来ます。
通常のPandasを読み込みする際も
省略した変数 pd を用いていると思うので
それに合わせる形にすると
既存のPandasを用いたコードに
そのまま適応できる様です。
速度検証用のコード
今回はデータフレームに対して
様々な操作を行うものを用意してみました。
100万回試行して速度比較します。
結果は動画をご覧ください。
まとめ
まだベータ版っぽいので
これからもっと良くなるんだと思います。
試したい方は色々遊んでみて下さい
それでは。
互換ライブラリ「FireDucks」を試してみました。
解説動画はこちら
Fireducksについて
早速速度を試してみましょう。
インストール方法
インストールコマンドを実行するだけです。
pip install fireducks
読み込み方
import文を実行するだけで
読み込み出来ます。
import fireducks.pandas as pd
通常のPandasを読み込みする際も
省略した変数 pd を用いていると思うので
それに合わせる形にすると
既存のPandasを用いたコードに
そのまま適応できる様です。
速度検証用のコード
今回はデータフレームに対して
様々な操作を行うものを用意してみました。
100万回試行して速度比較します。
import pandas as pd
import numpy as np
import time
import fireducks.pandas as pd2
def create_data(N,t):
data = {
'A': np.random.randn(N),
'B': np.random.randn(N),
'C': np.random.choice(['O', 'P', 'P', 'A', 'Y'], N),}
if t:
return pd.DataFrame(data)
else:
return pd2.DataFrame(data)._evaluate()
# 処理時間の計測
def perform_measure(func,df,message):
start_time = time.time()
tmp = func(df)
end_time = time.time()
excute_time = end_time - start_time
#print(f"excute {message} time : {excute_time}")
return excute_time
# 加算処理
def df_calc(df):
return (df['A'] + df['B'])
# 文字列置換処理
def df_replace(df):
return df['C'].replace({"O":"1","P":"2","A":"3","Y":"4"})
# Filter処理
def df_filtering(df):
return df[df['A'] > 0.5]
# GroupBy処理
def df_groupby(df):
return df.groupby('C').mean()
# Sort処理
def df_sorting(df):
return df.sort_values(by='B')
# Join処理
def df_joining(df):
df1 = df[['A', 'B']].copy()
df2 = df[['C']].copy()
return df1.join(df2)
# Fillna処理
def df_fillna(df):
df_na = df.copy()
df_na.loc[df_na.sample(frac=0.1).index, 'A'] = np.nan
return df_na.fillna(0)
# Dropna処理
def df_dropna(df):
df_na = df.copy()
df_na.loc[df_na.sample(frac=0.1).index, 'A'] = np.nan
return df_na.dropna()
N = 1000000 df_pandas = create_data(N,True) df_ducks = create_data(N,False) c1 = perform_measure(df_calc,df_pandas,"calc") c2 = perform_measure(df_calc,df_ducks,"calc") r1 = perform_measure(df_replace,df_ducks,"replace") r2 = perform_measure(df_replace,df_ducks,"replace") f1 = perform_measure(df_filtering,df_pandas,"filtering") f2 = perform_measure(df_filtering,df_ducks,"filtering") g1 = perform_measure(df_groupby,df_pandas,"groupby") g2 = perform_measure(df_groupby,df_ducks,"groupby") s1 = perform_measure(df_sorting,df_pandas,"sorting") s2 = perform_measure(df_sorting,df_ducks,"sorting") j1 = perform_measure(df_joining,df_pandas,"joining") j2 = perform_measure(df_joining,df_ducks,"joining") fa1 = perform_measure(df_fillna,df_pandas,"fillna") fa2 = perform_measure(df_fillna,df_ducks,"fillna") da1 = perform_measure(df_dropna,df_pandas,"dropna") da2 = perform_measure(df_dropna,df_ducks,"dropna") data = [ ["calc",c1,c2], ["replace",r1,r2], ["filtering",f1,f2], ["groupby",g1,g2], ["sorting",s1,s2], ["joining",j1,j2], ["fillna",fa1,fa2], ["dropna",da1,da2], ] result_df = pd.DataFrame(data,columns=["処理","pandas","ducks"]) result_df["差分"] = result_df['pandas'] / result_df['ducks'] result_df
結果は動画をご覧ください。
まとめ
数値計算は高速化されているのが確認できた
文字列計算はもしかすると、あまり変わらないかも
その他の処理も速くなっている部分は有るらしいので
互換性や実行結果に問題が無ければ
高速化メリットあり、という所です。
高速化メリットあり、という所です。
まだベータ版っぽいので
これからもっと良くなるんだと思います。
試したい方は色々遊んでみて下さい
それでは。
