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.
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.