Ian Chou's Blog

用 rustworkx 取代 NetworkX:Python 圖運算的 Rust 加速

用 rustworkx 取代 NetworkX:Python 圖運算的 Rust 加速

當 NetworkX 成為效能瓶頸時,用 rustworkx(Rust 實作、Python API)提速 10-100 倍。本文更新為「現行 repo 實作」:預設使用 rustworkx,缺少依賴時 fallback 到 NetworkX。

為什麼要換 NetworkX

情境 NetworkX 需求
小型圖 (<1000 nodes) ✅ 足夠 不需換
大型圖 (>10K nodes) 🐢 慢 考慮換
即時查詢 (<10ms) ❌ 難達成 需要換
批量圖遍歷 🐢 瓶頸 建議換

我們的 GraphRAG 系統需要在每次查詢時做 2-hop 遍歷,NetworkX 約需 50ms;改用 rustworkx 後可顯著降低延遲。

技術選型

為什麼改用 rustworkx(現行)

方案 優點 缺點
rustworkx 安裝最簡單(pip/uv)、Rust 速度、API 直接給 Python 用 不是全功能圖資料庫
Petgraph + PyO3 可完全客製化、理論上可更極致 需要維護 Rust binding 與發佈流程
graph-tool 很快 安裝與環境相依性高
igraph 成熟、Leiden 生態常見 API/資料結構不一定貼合需求

本 repo 的取捨是:優先把「查詢熱路徑」變快、同時保持安裝與開發體驗,因此以 rustworkx 作為預設 Rust 加速後端,並保留 NetworkX 當 fallback。

專案結構(現行)

py-kb/
└── src/career_kb/graph/
    └── knowledge_graph.py         # rustworkx / NetworkX backend wrapper

後端選擇邏輯在:

Step 1:安裝與依賴(現行)

py-kb 的依賴已包含 rustworkx,因此一般只要:

cd py-kb
uv sync

依賴來源可見:

Step 2:Python 橋接層(現行)

目前的橋接層會先嘗試 import rustworkx,失敗才 fallback 到 NetworkX:

try:
    import rustworkx as rx
    USE_RUSTWORKX = True
except ImportError:
    USE_RUSTWORKX = False

import networkx as nx

程式實作在:

Step 3:驗證你現在用的後端

CLI 會顯示目前 graph backend:

cd py-kb
uv run career-kb graph show

命令入口:

何時還需要 Petgraph + PyO3

如果你需要更深度客製化資料結構、或想把更多圖運算搬到 Rust(不只 traversal),才會考慮自製 Rust binding(Petgraph + PyO3 / maturin)。但以目前 repo 目標來說,rustworkx 已能提供足夠的效能提升與更好的維護成本。


Career Knowledge Base 是一個本地優先的履歷知識庫系統,使用 Python + Rust + LanceDB + LlamaIndex 建構。