Skip to content

Commit d163723

Browse files
daxfohlMichaelBroughton
authored andcommitted
Add / improve CircuitOperation memoizing (quantumlib#4855)
@95-martin-orion Small change to cache control keys in circuit operations
1 parent cf05645 commit d163723

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

cirq-core/cirq/circuits/circuit_operation.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ class CircuitOperation(ops.Operation):
9696
_cached_measurement_key_objs: Optional[AbstractSet['cirq.MeasurementKey']] = dataclasses.field(
9797
default=None, init=False
9898
)
99+
_cached_control_keys: Optional[AbstractSet['cirq.MeasurementKey']] = dataclasses.field(
100+
default=None, init=False
101+
)
99102

100103
circuit: 'cirq.FrozenCircuit'
101104
repetitions: int = 1
@@ -208,9 +211,14 @@ def _measurement_key_names_(self) -> AbstractSet[str]:
208211
return {str(key) for key in self._measurement_key_objs_()}
209212

210213
def _control_keys_(self) -> AbstractSet['cirq.MeasurementKey']:
211-
if not protocols.control_keys(self.circuit):
212-
return frozenset()
213-
return protocols.control_keys(self.mapped_circuit())
214+
if self._cached_control_keys is None:
215+
keys = (
216+
frozenset()
217+
if not protocols.control_keys(self.circuit)
218+
else protocols.control_keys(self.mapped_circuit())
219+
)
220+
object.__setattr__(self, '_cached_control_keys', keys)
221+
return self._cached_control_keys # type: ignore
214222

215223
def _parameter_names_(self) -> AbstractSet[str]:
216224
return {

0 commit comments

Comments
 (0)