Performance highlights

August 21, 2026 · View on GitHub

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.

WorkloadComparisonMeasured resultResearch example
64-qubit, 1,024-term local QWC workload; support width at most 4Qiskit 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 workloadIndependent NumPy/Python largest-first baselineGrouping: 20.0× faster. Reconstruction: 3.0× faster for all 26 groups and 1,024 synthetic shots; outputs agree exactly.Measurement-grouping example

Memory wins

WorkloadComparisonResource resultResearch example
6-site eager Holstein sparse executionQuSpin explicit sparse pathAbout 6× lower peak RSS; at four threads, the native MVP is also about 1.8× fasterHolstein example
7-site lazy Holstein MVP; 20,070,400-dimensional sectorQuSpin matrix-free execution1.13× faster with about 2× lower peak RSSHolstein example
4×4 half-filled Fermi–Hubbard MVPQuSpin matrix-free executionAbout 2.16× lower peak RSS with the same 2.650 GB input/output buffersFermi–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.

WorkloadBaselineMeasured resultResearch example
Fourth-order Pauli BCH; 8 qubits and 44 terms per generatorPython dictionary recurrenceAbout 4.7× faster native end-to-endBCH convergence example
Bounded 64-qubit Pauli Lie closure; dimension cap 512Python dictionary recurrenceAbout 7.7× faster native closureLie-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.

WorkloadTenCirPauliTensorCircuit/JAXResult
Local-Pauli sampling, dense non-Clifford state, 20q/8,192 shots19.73 s, 2.409 ms/shot77.56 s, 9.468 ms/shotNative 3.93× lower total time
Pauli estimator on 8,192 imported snapshots67.2 μs1.855 msNative 27.3× lower; same-data path
Global-Clifford sampling, dense non-Clifford state, 20q/8,192 shots106.78 s, 13.034 ms/shotStandalone native workload; no equivalent baseline claimed
Dense-target fidelity post-processing on the same Clifford snapshots28.54 sStandalone 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.