From be1ad85087b6cab6f46367918677f966d8fbd416 Mon Sep 17 00:00:00 2001 From: Manideep3969 Date: Thu, 20 Aug 2026 12:35:17 +0530 Subject: [PATCH] perf(#52): cache average gate error rates in CostModel _avg_single_qubit_error and _avg_two_qubit_error recomputed averages from device dictionaries on every call. For a circuit with N gates, this meant N redundant list/dict iterations. Fix: Cache the computed averages on first call, returning the cached value on subsequent calls. --- src/qc_compiler/cost_model.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/qc_compiler/cost_model.py b/src/qc_compiler/cost_model.py index 2cc5251..fd49dcd 100644 --- a/src/qc_compiler/cost_model.py +++ b/src/qc_compiler/cost_model.py @@ -124,6 +124,8 @@ def __init__(self, backend=None): idealized model. """ self.device = self._load_device_characterization(backend) + self._cached_avg_single_qubit_error = None + self._cached_avg_two_qubit_error = None def _load_device_characterization(self, backend) -> DeviceCharacterization: """Load device calibration data from a backend. @@ -346,19 +348,29 @@ def _get_gate_fidelity_for_pair( def _avg_single_qubit_error(self) -> float: """Compute average single-qubit gate error across all qubits.""" + if self._cached_avg_single_qubit_error is not None: + return self._cached_avg_single_qubit_error + if not self.device.single_qubit_gate_errors: - return DEFAULT_SINGLE_QUBIT_ERROR + self._cached_avg_single_qubit_error = DEFAULT_SINGLE_QUBIT_ERROR + return self._cached_avg_single_qubit_error errors = list(self.device.single_qubit_gate_errors.values()) - return sum(errors) / len(errors) + self._cached_avg_single_qubit_error = sum(errors) / len(errors) + return self._cached_avg_single_qubit_error def _avg_two_qubit_error(self) -> float: """Compute average two-qubit gate error across all qubit pairs.""" + if self._cached_avg_two_qubit_error is not None: + return self._cached_avg_two_qubit_error + if not self.device.two_qubit_gate_errors: - return DEFAULT_TWO_QUBIT_ERROR + self._cached_avg_two_qubit_error = DEFAULT_TWO_QUBIT_ERROR + return self._cached_avg_two_qubit_error errors = list(self.device.two_qubit_gate_errors.values()) - return sum(errors) / len(errors) + self._cached_avg_two_qubit_error = sum(errors) / len(errors) + return self._cached_avg_two_qubit_error def estimate_decoherence_error( self, circuit: QuantumCircuit, layout: dict | None = None