A NetworkX 3.x backend that accelerates selected graph algorithms with rustworkx.
Keep import networkx as nx. nx-rustworkx converts an nx.Graph, runs the
rustworkx kernel, and remaps the result to the original node IDs. Unsupported
calls stay on NetworkX.
Real NetworkX projects with the backend switched on, application code
unchanged — measured by the runners in
benches/external/ on one 4-CPU machine:
| workload | NetworkX | nx-rustworkx | speedup |
|---|---|---|---|
| City street network (OSMnx MultiDiGraph), weighted closeness centrality | 358 s | 2.6 s | 136× |
| Same network, betweenness centrality | 115 s | 1.5 s | 78× |
| Same network, 200 point-to-point travel-time routes | 8.0 s | 2.3 s | 3.4× |
| nx-parallel's benchmark suite, all-pairs Bellman–Ford lengths (n=400) | 18.7 s | 0.44 s | 42× |
| NetworkX's own benchmark suite, strongly connected components (n=10,000) | 32 ms | 4 ms | 8× |
Good fit: CPU-heavy whole-graph algorithms on graphs from a few hundred nodes up — centralities, all-pairs shortest paths, components, isomorphism — and repeat-call pipelines, where the one-time conversion is cached across calls. Street networks work as-is: MultiDiGraphs with parallel ways dispatch with NetworkX's parallel-edge semantics.
Not the tool: tiny graphs (auto-dispatch declines below 200 nodes or 400
edges on purpose), one-off calls to linear-time functions where conversion
costs more than NetworkX's answer, algorithms NetworkX already runs on
C-backed SciPy (pagerank), custom weight callables, and code that walks
G.adj itself instead of calling nx.* functions — a backend can only
accelerate the NetworkX API.
pip install nx-rustworkxRequires Python 3.10+, NetworkX 3.4+, and rustworkx 0.18+.
Set rustworkx as a preferred backend:
NETWORKX_BACKEND_PRIORITY=rustworkx python your_script.pyOr configure it in Python:
import networkx as nx
G = nx.erdos_renyi_graph(2_000, 0.01, seed=1)
nx.config.backend_priority = ["rustworkx"]
scores = nx.betweenness_centrality(G)The backend implements 111 algorithms. Its measured cutoffs keep small or
conversion-heavy calls on NetworkX; backend="rustworkx" explicitly tries the
rustworkx implementation.
Generators such as nx.path_graph and nx.gnp_random_graph can construct
rustworkx-backed graphs directly, so whole pipelines skip conversion; the
usage guide covers enabling
generator dispatch.
Usage, configuration, supported algorithms, caveats, and benchmarks: ville.dev/nx-rustworkx
MultiGraphandMultiDiGraphdispatch with NetworkX's parallel-edge semantics (minimum weight for paths, summed weights for PageRank, collapsed bundles for betweenness and bridges, keyed results for spanning trees). The 14 functions NetworkX itself refuses on multigraphs, pluscomplement, the graph products andvf2pp_all_isomorphisms, fall back to NetworkX; so do the native generators whencreate_usingis a multigraph class.- No custom weight callables.
- The rustworkx-backed graph object does not implement drawing or I/O.
- Some valid results may differ in ordering or floating-point rounding.
- Seeded random generators reproduce NetworkX's graphs unless
native_seeded_generatorsis enabled; the opt-in draws from rustworkx's RNG, so the same seed gives a different, equally valid graph.
The algorithm reference lists the exact behavior and fallback conditions.
uv sync --extra test
uv run pytest testsSee the development guide for the full test, lint, benchmark, and architecture notes.
BSD-3-Clause.