Improve circuit compilation performance #375
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR speeds up working with and compiling large circuits.
Here is a simple benchmark to test this:
Code
Having
optimize_circuit=False
is necessary, without it the Qulacs optimization will take very long.Before this pull request, the script took about 17 seconds on my machine.
The first change is to revert #360, because I didn't realize how big the performance impact of the deepcopy call here is.
I don't like removing this, but it reduces the runtime to around 10 seconds, and it seems like it was fine without the copy for years before I made that pull request.
I extended the warning message to explain the specific case that made me add the copy.
The second change is optimizing the
replace_gates
function, because it is currently implemented in an inefficient way that performs a lot of unnecessary copying. This change reduces the runtime of the script to about 3 seconds.I also fixed a problem in the
QubitWaveFunction
length
method where it also counted zeros, and added a function forBitString
that returns the stored integer in a specified bit ordering.