什么是 FireDucks?
FireDucks 是一個(gè)完全兼容 Pandas 的加速庫,它不是要替代 Pandas,而是作為 Pandas 的加速器工作。它允許用戶繼續(xù)使用熟悉的 Pandas API,同時(shí)顯著提高執(zhí)行速度。
FireDucks 的核心特點(diǎn) 1. 完全兼容 Pandas
使用與 Pandas 相同的 API
無需修改現(xiàn)有代碼
可以輕松替換現(xiàn)有的 Pandas 代碼
比原生 Pandas 快數(shù)倍到數(shù)十倍
特別適合處理大型數(shù)據(jù)集和復(fù)雜操作
導(dǎo)入鉤子(Import Hook):不需要修改代碼,自動(dòng)替換 Pandas 導(dǎo)入
%load_ext fireducks.pandas import pandas as pd
顯式導(dǎo)入(Explicit Import):手動(dòng)替換導(dǎo)入語句 import fireducks.pandas as pd
FireDucks 通過兩種主要方法加速 Pandas 操作:
編譯器優(yōu)化:
將 Python 程序轉(zhuǎn)換為中間語言
專為 DataFrame 操作設(shè)計(jì)的優(yōu)化
多線程處理:
利用多核 CPU 并行處理數(shù)據(jù)
類似 GPU 加速的原理
惰性執(zhí)行模型:
不立即執(zhí)行操作,而是生成中間語言
只在需要結(jié)果時(shí)(如保存文件、顯示數(shù)據(jù))才執(zhí)行所有操作
批處理優(yōu)化提高整體性能
FireDucks 目前支持 Linux (manylinux) 在 x86_64 架構(gòu)上,可以通過 pip 輕松安裝:
pip install fireducks
要求 Python >3.8, <=3.13(注意:自 FireDucks 1.1.0 起,由于升級(jí)了依賴的 pyarrow 到 18.0.0,不再支持 Python 3.8)
使用方法 方法一:導(dǎo)入鉤子(推薦)
在 Python 腳本中使用:
python3 -m fireducks.pandas your_script.py
在 IPython/Jupyter Notebook 中使用:
%load_ext fireducks.pandas import pandas as pd # 后續(xù)代碼與使用 Pandas 完全相同
方法二:顯式導(dǎo)入# 替換 import pandas as pd import fireducks.pandas as pd
性能對比以下是一個(gè)簡單的性能對比示例:
import time import numpy as np import pandas as pd import fireducks.pandas as fpd n = 1_000_000 np.random.seed(42) data = { "x": np.random.randint(0, 100, n), "y": np.random.rand(n) } df_pandas = pd.DataFrame(data) df_fireducks = fpd.DataFrame(data) start_pd = time.time() sorted_pd = df_pandas.sort_values("x") time_pd = time.time() - start_pd start_fd = time.time() sorted_fd = df_fireducks.sort_values("x") time_fd = time.time() - start_fd print("Pandas 排序時(shí)間:{:.4f} 秒".format(time_pd)) print("FireDucks 排序時(shí)間:{:.4f} 秒".format(time_fd))
結(jié)果:
Pandas 排序時(shí)間: 0.0009 秒 FireDucks 排序時(shí)間: 0.0004 秒
在更大的數(shù)據(jù)集和更復(fù)雜的操作中,性能差異會(huì)更加明顯。
性能測量注意事項(xiàng)
由于 FireDucks 使用惰性執(zhí)行模型,測量單個(gè)方法的性能需要特別注意。有三種方法可以準(zhǔn)確測量性能:
啟用基準(zhǔn)測試模式:
# 通過環(huán)境變量 FIREDUCKS_FLAGS="--benchmark-mode" # 或在代碼中 from fireducks.core import get_fireducks_options get_fireducks_options().set_benchmark_mode(True)
使用
_evaluate()
方法:t0 = time.time() df = pd.read_csv("data.csv")._evaluate() t1 = time.time() df = df.sort_values("a")._evaluate() t2 = time.time()
FireDucks 團(tuán)隊(duì)評估了 db-benchmark[1] 的性能,該基準(zhǔn)測試包括在多種大小的數(shù)據(jù)集上執(zhí)行基本數(shù)據(jù)科學(xué)操作的場景。
截至 2024 年 9 月 10 日,F(xiàn)ireDucks 在大數(shù)據(jù)的分組(groupby)和連接(join)操作方面似乎是最快的數(shù)據(jù)框架庫。
測試環(huán)境:
FireDucks 版本:fireducks-1.0.4
CPU 型號(hào):Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz
CPU 核心數(shù):128
內(nèi)存:256GB
TPC-H 是一個(gè)決策支持基準(zhǔn)測試,包含復(fù)雜的查詢和大量數(shù)據(jù)修改。
上圖比較了四個(gè)數(shù)據(jù)框架庫(Pandas、DuckDB、Polars 和 FireDucks)在 22 個(gè)不同查詢上的性能。垂直軸以對數(shù)刻度顯示與 Pandas 相比快多少倍,大于 1 表示比 Pandas 快。
測試環(huán)境:
服務(wù)器規(guī)格(AWS EC2 m7i.8xlarge)
CPU:INTEL(R) XEON(R) GOLD 6526Y(32 核)
內(nèi)存:512GB
操作系統(tǒng):Ubuntu 24.04
TPCx-BB 包括與使用機(jī)器學(xué)習(xí)及其預(yù)處理的數(shù)據(jù)分析相關(guān)的查詢。
在 TPCx-BB 測試中,F(xiàn)ireDucks 比 Pandas 最高快 17 倍,平均快 6.7 倍。
測試環(huán)境:
CPU:Intel(R) Xeon(R) Gold 5317 CPU @ 3.00GHz x 2 插槽(共 48 個(gè)硬件線程)
內(nèi)存:256GB
測試版本:
pandas-2.1.4
fireducks-0.9.3
由于惰性執(zhí)行模型,使用傳統(tǒng)的 try-catch 塊檢查 KeyError 可能不會(huì)按預(yù)期工作:
# 不推薦的方式 def project(df, cname): try: s = df[cname] # 由于惰性執(zhí)行,這里不會(huì)立即執(zhí)行 except KeyError: print(f"列 {cname} 在輸入數(shù)據(jù)框中不存在") else: return s
推薦的方式:
# 推薦方式 1:使用 _evaluate() 強(qiáng)制執(zhí)行 def project(df, cname): try: s = df[cname]._evaluate() except KeyError: print(f"列 {cname} 在輸入數(shù)據(jù)框中不存在") else: return s # 推薦方式 2:使用 in 操作符 def project(df, cname): if cname notin df: # 這會(huì)立即執(zhí)行 print(f"列 {cname} 在輸入數(shù)據(jù)框中不存在") else: s = df[cname] return s
在線體驗(yàn) FireDucks您可以通過 Google Colab 免費(fèi)體驗(yàn) FireDucks 的易用性和高性能:
pandas_nyc_demo.ipynb [2]
fireducks_pandas_nyc_demo.ipynb [3]
FireDucks_vs_Pandas_vs_Polars.ipynb [4]
FireDucks 是一個(gè)強(qiáng)大的 Pandas 加速庫,通過編譯器優(yōu)化和多線程處理,顯著提高了數(shù)據(jù)處理速度,同時(shí)保持了與 Pandas 的完全兼容性。它特別適合處理大型數(shù)據(jù)集和復(fù)雜的數(shù)據(jù)操作,可以輕松集成到現(xiàn)有的 Pandas 代碼中,無需大量修改。
根據(jù)多項(xiàng)基準(zhǔn)測試,F(xiàn)ireDucks 在各種數(shù)據(jù)處理場景中都展現(xiàn)出了顯著的性能優(yōu)勢,尤其是在處理大型數(shù)據(jù)集和復(fù)雜查詢時(shí)。
資源鏈接
官方網(wǎng)站: https://fireducks-dev.github.io [5]
GitHub 倉庫: https://github.com/fireducks-dev/fireducks [6]
聯(lián)系方式: contact@fireducks.jp.nec.com [7]
Slack 社區(qū): 加入 FireDucks Slack [8]
參考資料
db-benchmark: https://github.com/duckdblabs/db-benchmark
pandas_nyc_demo.ipynb: https://colab.research.google.com/github/fireducks-dev/fireducks/blob/main/notebooks/nyc_demo/pandas_nyc_demo.ipynb
fireducks_pandas_nyc_demo.ipynb: https://colab.research.google.com/github/fireducks-dev/fireducks/blob/main/notebooks/nyc_demo/fireducks_pandas_nyc_demo.ipynb
FireDucks_vs_Pandas_vs_Polars.ipynb: https://colab.research.google.com/github/fireducks-dev/fireducks/blob/main/notebooks/FireDucks_vs_Pandas_vs_Polars.ipynb
[5]
https://fireducks-dev.github.io: https://fireducks-dev.github.io
[6]
https://github.com/fireducks-dev/fireducks: https://github.com/fireducks-dev/fireducks
[7]
contact@fireducks.jp.nec.com: mailto:contact@fireducks.jp.nec.com
[8]
加入 FireDucks Slack: https://join.slack.com/t/fireducks/shared_invite/zt-2j4lucmtj-IGR7AWlXO62Lu605pnBJ2w
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.