From 8e223fab275953867e9df39468d99b58d29cc310 Mon Sep 17 00:00:00 2001 From: mhucka <1450019+mhucka@users.noreply.github.com> Date: Sun, 12 Apr 2026 04:20:21 +0000 Subject: [PATCH] Optimize MatrixGate translation using NumPy interleaving Replaced an inefficient nested list comprehension with a NumPy-based approach for interleaving real and imaginary parts of unitary matrices. This avoids thousands of small list allocations and leverages NumPy's optimized slicing and flattening. --- qsimcirq/qsim_circuit.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/qsimcirq/qsim_circuit.py b/qsimcirq/qsim_circuit.py index a5b4ae277..1b89cced6 100644 --- a/qsimcirq/qsim_circuit.py +++ b/qsimcirq/qsim_circuit.py @@ -306,9 +306,11 @@ def add_op_to_circuit( time, qsim_qubits, qsim_gate._diag_angles_radians, circuit ) elif gate_kind == qsim.kMatrixGate: - m = [ - val for i in list(cirq.unitary(qsim_gate).flat) for val in [i.real, i.imag] - ] + unitary = cirq.unitary(qsim_gate) + m = np.empty(unitary.size * 2, dtype=np.float64) + m[0::2] = unitary.real.flat + m[1::2] = unitary.imag.flat + m = m.tolist() if isinstance(circuit, qsim.Circuit): qsim.add_matrix_gate(time, qsim_qubits, m, circuit) else: