Skip to content

Performance highlights

TenCirPauli is built to keep structured quantum workloads compact from the Python call to the native execution kernel. The research examples below collect representative measured wins against TensorCircuit/JAX, QuSpin, PauliPropagation.jl, OpenFermion, and independent Python baselines.

Headline results

01 / U(1) VQE

688×

faster first compiled value + gradient

60-qubit, two-particle VQE

37.3× faster end-to-end, including JAX compilation, and 2.60× faster in steady execution.

Open the Research Example →

02 / FERMION MAPPING

22.3×

faster Jordan–Wigner mapping

12-mode Hubbard mapping

Bravyi–Kitaev mapping is 12.6× faster; end-to-end mapping is 9.5× and 6.0× faster.

Open the Research Example →

03 / PAULI PROPAGATION

7.8×

faster first value + gradient

28-qubit Pauli VQE

1.43× faster steady execution against PauliPropagation.jl at max_weight=5.

Open the Research Example →

04 / RESTRICTED MVP

1.73×

faster Fermi–Hubbard MVP

4×4 half-filled sector

The same run also uses 2.16× less peak RSS than QuSpin.

Open the Research Example →

05 / MEASUREMENT GROUPING

38×

faster QWC grouping

64-qubit, 1,024-term local Pauli workload

This is the grouping stage; the same study also validates 26 groups and measures native bitstring post-processing separately.

Open the Research Example →

06 / CLASSICAL SHADOWS

3.93×

faster local-Pauli sampling

20-qubit, 8,192-shot shadow workload

19.73 s native versus 77.56 s for TensorCircuit/JAX with synchronized batches of 64.

Open the Research Example →

The cards show the strongest headline results. The tables below add the resource and symbolic-algebra comparisons without competing with the main message.

Measurement grouping

The measurement workflow has two distinct timed stages. Grouping builds the compatible measurement partitions and bases; reconstruction consumes already sampled rotated bitstrings and computes the corresponding Pauli eigenvalues. The reconstruction number does not include circuit execution, sampling, or Qiskit's grouping runtime.

Workload Comparison Measured result Research example
64-qubit, 1,024-term local QWC workload; support width at most 4 Qiskit SparsePauliOp.group_commuting(qubit_wise=True) Grouping: 37.9× faster; both produce 26 groups. Reconstruction is not compared because this runner does not implement that post-processing path. Measurement-grouping example
Same workload Independent NumPy/Python largest-first baseline Grouping: 20.0× faster. Reconstruction: 3.0× faster for all 26 groups and 1,024 synthetic shots; outputs agree exactly. Measurement-grouping example

Memory wins

Workload Comparison Resource result Research example
6-site eager Holstein sparse execution QuSpin explicit sparse path About 6× lower peak RSS; at four threads, the native MVP is also about 1.8× faster Holstein example
7-site lazy Holstein MVP; 20,070,400-dimensional sector QuSpin matrix-free execution 1.13× faster with about 2× lower peak RSS Holstein example
4×4 half-filled Fermi–Hubbard MVP QuSpin matrix-free execution About 2.16× lower peak RSS with the same 2.650 GB input/output buffers Fermi–Hubbard example

Native baseline comparisons

These studies compare the native implementation with small independent Python dictionary prototypes, making the benefit of moving repeated symbolic work into the Rust core visible without presenting a prototype as a competing production library.

Workload Baseline Measured result Research example
Fourth-order Pauli BCH; 8 qubits and 44 terms per generator Python dictionary recurrence About 4.7× faster native end-to-end BCH convergence example
Bounded 64-qubit Pauli Lie closure; dimension cap 512 Python dictionary recurrence About 7.7× faster native closure Lie-closure example

Classical-shadow workloads

The default classical-shadow research example uses 20 qubits, 8,192 settings, one repeat, and the JAX CPU backend in batches of 64. The release-mode record below includes the public call and synchronized JAX conversion; it is a single Apple arm64/macOS 15.3.1 run with Python 3.11.15, TensorCircuit-NG 1.9.1, JAX 0.10.2, TenCirPauli 0.5.0, and RAYON_NUM_THREADS=4.

Workload TenCirPauli TensorCircuit/JAX Result
Local-Pauli sampling, dense non-Clifford state, 20q/8,192 shots 19.73 s, 2.409 ms/shot 77.56 s, 9.468 ms/shot Native 3.93× lower total time
Pauli estimator on 8,192 imported snapshots 67.2 μs 1.855 ms Native 27.3× lower; same-data path
Global-Clifford sampling, dense non-Clifford state, 20q/8,192 shots 106.78 s, 13.034 ms/shot Standalone native workload; no equivalent baseline claimed
Dense-target fidelity post-processing on the same Clifford snapshots 28.54 s Standalone native workload; dense target has 2**20 amplitudes

The run also sampled a 64-qubit stabilizer input with 128 settings in 19.7 ms. These values are informational rather than universal speed guarantees; the exact command, seed, estimates, and cold JAX setup are recorded in the example README. The complete benchmark suite additionally covers RDM, Rényi-2, energy variance, batched estimators, and both fidelity paths.

All numbers are representative results from the linked studies, not universal maxima. Each example contains the workload definition, correctness checks, and the command used to reproduce the comparison.