Skip to content

Commit c4e0106

Browse files
committed
Defer extraction of moment keys until necessary
Skip potentially expensive lookup of measurement and control keys from a Moment when inserted operation has no such keys. No change in code function.
1 parent 42c13d6 commit c4e0106

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

cirq-core/cirq/circuits/circuit.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,14 +2159,21 @@ def _can_add_op_at(self, moment_index: int, operation: cirq.Operation) -> bool:
21592159
op_measurement_keys = protocols.measurement_key_objs(operation)
21602160
op_control_keys = protocols.control_keys(operation)
21612161

2162-
moment_measurement_keys = protocols.measurement_key_objs(self._moments[moment_index])
2163-
moment_control_keys = protocols.control_keys(self._moments[moment_index])
2164-
2165-
return (
2166-
op_measurement_keys.isdisjoint(moment_measurement_keys)
2167-
and op_control_keys.isdisjoint(moment_measurement_keys)
2168-
and moment_control_keys.isdisjoint(op_measurement_keys)
2169-
)
2162+
# defer extraction of moment keys until truly needed
2163+
result = True
2164+
if op_control_keys or op_measurement_keys:
2165+
moment_measurement_keys = protocols.measurement_key_objs(self._moments[moment_index])
2166+
result = op_control_keys.isdisjoint(moment_measurement_keys) and (
2167+
(
2168+
op_measurement_keys.isdisjoint(moment_measurement_keys)
2169+
and op_measurement_keys.isdisjoint(
2170+
protocols.control_keys(self._moments[moment_index])
2171+
)
2172+
)
2173+
if op_measurement_keys
2174+
else True
2175+
)
2176+
return result
21702177

21712178
def _latest_available_moment(self, op: cirq.Operation, *, start_moment_index: int = 0) -> int:
21722179
"""Finds the index of the latest (i.e. right most) moment which can accommodate `op`.

0 commit comments

Comments
 (0)