FireDucks vs Pandas 速度勝負、データサイズ500万行あたりが勝負の分かれ目

### **user**:

ChatGPT先生、先日の「FireDucksの速度がPandasとほとんど変わらなかった件」について、覚えてますか？ 記事投稿したら早速、開発者と思しき方からご連絡があったんですよ。

---

### **assistant**:

おおお、それはめちゃくちゃ面白そうな展開やね！開発者さまから直接連絡があるなんて、なんか興奮するわ！具体的には何て言われたんや？あるいは、どんな反応があったんか教えてくれるかな？

---

### **user**:

引用させていただきますと

> 検証コードにおいてFireducksがpandasよりも速くならなかったのは
> read_csv()のencodingの引数がFireducksで(10/9日現在)未対応なのが理由だと思います．> (encoding引数もすぐに対応いたしますので，少しお待ちください)
> extract関数の
> df = pd.read_csv(filename, encoding="utf-8")
> を
> df = pd.read_csv(filename)
> としていただくとFireducksの高速化性能を実感いただけると思います．
> 
> また
> data_size, df = extract()
> のあとに
> df._evaluate()
> といれていただくと
> df作成の処理がここで実行させるので正確な時間測定ができると思います．

https://qiita.com/maskot1977/items/feb032f964a361728388#comment-fe36ceda2fafac4bd035

とのことでした。

---

### **assistant**:

おおお、それは直接開発者からフィードバックをもらえるのはめっちゃええことやね！この新しい情報を持って、あんたのコードが改善されるやろうしな。Open Sourceの魔法やな。

開発者の言う通り、"encoding"引数がFireducksのread_csv()関数でまだサポートされていないけど、それがおそらくあんたがFireducksの高速化性能を十分に活用できなかった理由やねんな。それと、別の提案として、データフレームdfが作成された後にdf._evaluate()を呼び出すことで、実際のデータ処理がその場で実行されて、より正確な時間測定ができるんやって。

それなら、この新しい知識を使って、あんたのコードを修正したり再実行したりするんが次のステップやな。それで、Fireducksの速度がどの程度改善するか見てみたらどうや？そんなあんたの成果を楽しみに待っとるで！

---

### **user**:

はい、それで、早速再計算してみました。

表を読み込んで抽出する部分はこう、

```python
def extract(filename="test_data.csv"):
    # df = pd.read_csv(filename, encoding="utf-8")
    df = pd.read_csv(filename)
    data_size = len(df)
    record = df.values[0]

    col_label = df.columns[0]
    df = df[df[col_label] == record[0]]

    col_label = df.columns[1]
    df = df[df[col_label] == record[1]]

    return data_size, df
```

時間計測する部分はこうですね。

```python
import time

measurement = []
for i in range(10, 300, 30):
    make_data_table(i, i, i)
    start_time = time.time()
    data_size, df = extract()
    df._evaluate()
    finish_time = time.time()
    print([data_size, finish_time - start_time])
    measurement.append([data_size, finish_time - start_time])
```

この ._evaluate() っていう部分は、FireDucks にあって Pandas にない部分なので Pandasでは使えないんですけどね。



---

### **assistant**:

なるほど！開発者のアドバイスを使ってあんたのコードをアップデートしたんやね。その `._evaluate()` 部分やけど、これは FireDucks が言うなら "遅延評価" と呼ばれる機能を採用していて、データ操作が直ちに実行されるんじゃなくて後で一緒に実行されるようにスケジュールされるから必要なんや。これによってFireDucksが全体の効率を最大化しようとするんや。

そして、その関数を使うことで、コードの一部が実行される具体的な時間を制御できるんや。これは、あんたがデータ操作とそれにかかる時間を測定するために重要なポイントやで。その `_evaluate()` 部分は、あんたが `df` の計算を実行して、その後に所要時間を測定するためのスタート地点を正確に設定するために使うんやな。

で、新しい計測結果はどんな感じになったんや？ FireDucks の高速化性能が実感できたかな？

---

### **user**:

簡単にいうと、データサイズ 5,000,000 行 (500万行) 付近よりも小さい場合は Pandas のほうが速く、データサイズがそれより大きくなると FireDucks のほうが速くなるという結果でした。

![output_9_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/acdb2d5a-2d38-986a-daed-fcc97c9b744d.png)

![output_10_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/547261a5-1c34-282d-a62e-ea015cc4ae77.png)


---

### **assistant**:

おおお、それは素晴らしい結果やね！500万行というのは立派なデータ量で、それを超えてくるとFireDucksの方が圧勝するんやね。それはベンチマークテストの重要な洞察やな。これなら「FireDucksはデータセットが大きくとも高速」といえるやろ。

普通は、データセットのサイズが大きくなるにつれて、パフォーマンスが大きく低下する傾向にあるもんやからな。でも、FireDucksがそれを逆にしとるんや。つまり、大規模なデータセットでの作業に最適化されているという意味やで。

なかなかええ結果やな。それを新たに記事にするのが、あんたの次なる一手かもしれんな。その種明かしを楽しみに待っとるで！

---

### **user**:

種明かしは、すみません、自分には無理ですw

というわけで、今回の記事のタイトル候補をいくつか提案してくれませんか？

---

### **assistant**:

んんん、そやな。新しい結果に基づいて記事を書くとしたら、こんなタイトルはどうかな？

1. "FireDucksとPandas、500万行で分かれた道！"
2. "データが500万行を超えたときの適応：FireDucks vs Pandas"
3. "火の鴨たちが飛躍する瞬間：500万行を超えて、FireDucksはPandasを超えます！"
4. "大規模データセットの英雄：データ量が500万を超えても、FireDucksが高速化！"
5. "FireDucksとPandas：データ500万行が引き離しの分かれ道！"

あんたがデータセットの規模によって性能がどう変わるかについて詳細に調べた新たな発見を、見事に伝えるためのタイトルやと思うで。なかなか面白そうな記事になりそうやわ！ええ物語になることを、心から楽しみに待っとるで！

---

### **user**:

ありがとうございます。んー、「FireDucks vs Pandas 速度勝負、データサイズ500万行あたりが勝負の分かれ目」って感じにしましょうかね。でもまあ、計算時間が気になる場合ってのはたいていデータサイズが大きい場合だと思うので、気になる時は FireDucks 使っとけって感じですかね。

---

### **assistant**:

ああ、そのタイトルもぐっとくるわ～！速度勝負の分かれ目を明確に示してて、読者にとって興味を惹きつける一方、内容への期待を高めるんとちゃうかな。

あんたの言う通り、データサイズが大きくなればなるほど、計算時間が問題となることが多いやろうしな。
そんな時はFireDucksを使えばええ、って言うのは全然その通りやんけ。

でもまあ、一応書いとくけど、その逆もまた真やで。データがそんなに大きない場合はPandasを使うのが良さそうやな、ってこともあるんやけど。

新しい記事に成功することを祈っとるわ！また何か質問あるときはわからんことがあるときは、何でも聞いてきてくれや！あんたの活躍、これからも楽しみにしてますわ！

---

### **user**:

はい、ありがとうございます。

コメントくださった開発者の方、ありがとうございました。

---

### **assistant**:

おお、それはええこと聞いてくれたわ！開発者の方に感謝の意を伝えるなんて、あんた、ええ人やな。きっと、あんたの素直さと尊敬の念が、そこから新たな機会を生み出すんやろうな。

また何か相談があったら、いつでも聞いてきてね。あんたのこれからの成功をそっと見守っとるで！それでは、またお会いしましょう。ばいばい！

---