Skip to content

Improve performance of stim.Circuit.append#1090

Merged
Strilanc merged 4 commits into
mainfrom
improveappendperformance
Jul 14, 2026
Merged

Improve performance of stim.Circuit.append#1090
Strilanc merged 4 commits into
mainfrom
improveappendperformance

Conversation

@Strilanc

@Strilanc Strilanc commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator
  • Replace cast-catch patterns with pybind11::detail::make_caster patterns
  • When a caster succeeds, and there are more items to look at, try to advance the loop while doing that caster again before trying other casters
  • Add a fast path check for list/tuple arguments

Ultimately, this makes calling circuit.append("CX", [0, 1]) around 50x faster and calling circuit.append("CX", [0, 1] * 1000) around 350x faster (!).

Before (vs after references):

[<<<<<<<<<<<<<<<<<<<<|....................] 9.1 ms (vs  27 us) (210 ktargets/s) benchmark_circuit_append_int_in_large_chunks
[...*<<<<<<<<<<<<<<<<|....................]  17 ms (vs 310 us) (110 ktargets/s) benchmark_circuit_append_int_in_small_chunks
[<<<<<<<<<<<<<<<<<<<<|....................] 6.6 ms (vs  24 us) (290 ktargets/s) benchmark_circuit_append_gate_targets_in_large_chunks
[..................*<|....................]  79 us (vs  46 us) ( 25 Mtargets/s) benchmark_circuit_append_pauli_strings_in_large_chunks
[....................*....................]  15 us (vs  15 us) (120 Mtargets/s) benchmark_circuit_append_text_in_large_chunks
[....................*....................] 180 us (vs 180 us) ( 10 Mtargets/s) benchmark_circuit_append_text_in_small_chunks

After:

[....................*....................]  24 us (vs  27 us) ( 80 Mtargets/s) benchmark_circuit_append_int_in_large_chunks
[....................*....................] 320 us (vs 310 us) (6.2 Mtargets/s) benchmark_circuit_append_int_in_small_chunks
[....................*....................]  24 us (vs  24 us) ( 82 Mtargets/s) benchmark_circuit_append_gate_targets_in_large_chunks
[....................*....................]  44 us (vs  46 us) ( 45 Mtargets/s) benchmark_circuit_append_pauli_strings_in_large_chunks
[....................*....................]  15 us (vs  15 us) (130 Mtargets/s) benchmark_circuit_append_text_in_large_chunks
[....................*....................] 190 us (vs 180 us) ( 10 Mtargets/s) benchmark_circuit_append_text_in_small_chunks

Fixes #1087

Strilanc added 4 commits July 13, 2026 15:45
- Special case list/tuple arguments
- Improve double conversion as well
@Strilanc Strilanc enabled auto-merge (squash) July 14, 2026 22:23
@Strilanc Strilanc merged commit adf5b14 into main Jul 14, 2026
55 checks passed
@Strilanc Strilanc deleted the improveappendperformance branch July 14, 2026 22:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Why stim._stim_polyfill.append is slow?

1 participant