Ian Chou's Blog

petgraph vs rustworkx / rustworkx-core:Rust 與 Python 圖計算怎麼選

petgraph vs rustworkx / rustworkx-core:Rust 與 Python 圖計算怎麼選

如果你在做 GraphRAG、推薦系統、關係網分析,常見的分歧是:
「我要一個純 Rust 的圖資料結構庫(方便客製)」,還是「我要一個現成的高效圖演算法工具箱(省時間)」?而當你同時要支援 Python 生態(例如要像 NetworkX 一樣用),選項又會再分叉一次。

本文把三個東西拆開講清楚:

TL;DR:怎麼選

三者的關係:誰建立在誰上面

功能比較(以工程選型角度)

面向 petgraph rustworkx-core(Rust) rustworkx(Python)
主要定位 資料結構 + 基礎演算法 petgraph 之上的「演算法擴充」 Python 圖庫(Rust 實作)
語言 / API 純 Rust 純 Rust(泛型 API) Python API(PyO3 綁定)
圖型別 多種 graph type,取捨清晰 通常直接吃 petgraph 的 graph PyGraph / PyDiGraph 等 Python 封裝
演算法覆蓋 基本款 + 一些常用演算法 更偏圖分析/圖運算工具箱 最完整、最貼近使用者(含大量 Python 封裝)
多執行緒 取決於你怎麼寫/用 部分演算法設計可並行(依實作而定) 多個演算法有 rayon 並行與 threshold 設計
安裝/整合 Rust 專案直接用 Rust 專案直接用(cargo) Python wheel / sdist(並提供 Stable ABI 相容路線)

什麼算「擴展」:rustworkx 0.17.x 的演算法面向

以 rustworkx 0.17.x 的釋出重點來看,它在「圖分析與工程化能力」上補了不少常用拼圖,例如:

對「GraphRAG 查詢端」來說,這些能力常常正好落在:
「我要做社群/中心性做 node ranking」、「我要把強連通縮點當成 query-time 的加速結構」、「我要批次路徑特徵」這類需求。

效能:該怎麼正確看 benchmark

你可以把效能問題拆成兩層:

  1. 語言與資料結構層:從 Python(NetworkX)換到 Rust(petgraph/rustworkx)本身就會是大幅躍升
  2. 演算法與平行化層:同樣在 Rust,是否有用到成熟、可並行的實作,會再拉開差距

rustworkx 官方 benchmark 的結論方向是:它在多個工作負載上對比 Python 生態常用圖庫表現很強,並且相對 NetworkX 可以有數倍到數十倍的差距(實際倍率會依圖大小、稀疏度、演算法而大幅變動)。在工程上建議的做法是:

Rust 專案:如何把 petgraph 升級成「petgraph + rustworkx-core」

這個遷移通常是「加法」而不是「替換」:你仍然用 petgraph 的圖型別與資料結構,只是把部分演算法呼叫改成 rustworkx-core 的實作。

Cargo.toml

[dependencies]
petgraph = "0.8"
rustworkx-core = "0.17"

實務上要注意的是:petgraph 版本要跟 rustworkx-core 相容。如果你碰到 trait bound 或型別不匹配,第一個要檢查的就是兩者版本是否在同一個相容區間。

直接用 rustworkx-core re-export 的 petgraph(可選)

rustworkx-core 會 re-export petgraph,所以你也可以把 import 統一從 rustworkx-core 出口進來,避免依賴樹中出現多份 petgraph:

use rustworkx_core::petgraph;
use rustworkx_core::centrality::betweenness_centrality;
 
let g = petgraph::graph::UnGraph::<i32, ()>::from_edges(&[
    (1, 2), (2, 3), (3, 4), (1, 4)
]);
 
let output = betweenness_centrality(&g, false, false, 200);

Graph extension:把「節點合併/收縮」變成方法

rustworkx-core 也提供一些 extension trait,讓你對特定 petgraph graph type 直接呼叫額外方法(例如 node contraction 相關能力)。在工程上好處是:你可以把「建圖」與「加速結構變換」留在 Rust 端完成,讓 Python 端只做輕量呼叫或結果消費。

Python 專案:什麼時候該直接用 rustworkx

如果你的目標是「NetworkX-style 開發體驗」,又希望演算法直接給你拿來用,那 rustworkx(Python 套件)通常是最短路徑。

幾個實務上的判斷點:

Rust + PyO3:兩種整合策略(給 GraphRAG 類專案)

你在 Rust 寫圖引擎、用 PyO3 給 Python 呼叫時,常見有兩種架構:

A. 你暴露的是「領域 API」(推薦)

這樣 Python 端不需要知道你的圖結構,也不需要承擔 API 相容問題。

B. 你暴露的是「通用圖 API」(成本更高)

除非你真的要做「可替換 NetworkX 的通用圖庫」,不然通常不划算。

常見誤解與踩坑

參考連結