Faster flatten for Sequence symbols #577
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 introduces a special case for flattening sequences as it's an operation/border case deeply embedded into the rules and evaluation engine and executed nearly each time a rule is resolved.
The main advantage of the new approach is that symbols are now tracked during
Expressionconstruction, such that all paths leading to a symbol can be efficiently identified in any part of anExpressiontree without having to revert to full tree traversals. In that way, all sub trees of anExpressionnot containing sequences don't have to be checked.The original optimization targeted with this PR was faster handling of huge lists. E.g., using
list = Nest[Partition[#, 2]&, Range[2 ^ 14], 14]:Without this PR:
With this PR:
In addition to this targeted case, this PR yields notable performance improvements across the board (see attached files, esp.
Random).opt4-before.txt
opt4-after.txt