Skip to content

Stop deep-copying the scope on every recursive evaluation - #18

Merged
MartinsMednis merged 1 commit into
mainfrom
stage4-lazy-scope-copy
Sep 14, 2026
Merged

MartinsMednis merged 1 commit into
mainfrom
stage4-lazy-scope-copy

Conversation

@MartinsMednis

Copy link
Copy Markdown
Collaborator

f() deep-copied its whole variable scope (c) on every single recursive evaluation step, even for leaf values. Only three constructs actually introduce new bindings - Constants, Reduce's legacy accumulator form, and TrapezoidalIntegrate - so only they need to copy, and only their own copy.

  • f() no longer copies c at all; leaf checks (numbers, True/False) moved above it
  • Constants, Reduce's legacy form, and TrapezoidalIntegrate each copy c themselves before writing into it, matching _apply_fn's existing pattern (local_c = dict(c))
  • Add tests/test_scope_isolation.py covering leak and cross-contamination cases in both directions

Measured 2-3x faster on arithmetic- and Reduce-heavy expressions. No behavior change. 765 tests pass (758 existing + 7 new), 1 skipped.

- f() no longer copies c at all; leaf checks moved above it
- Constants, Reduce's legacy form, and TrapezoidalIntegrate each
  copy c themselves before writing into it, matching _apply_fn's
  existing pattern
- Add tests/test_scope_isolation.py covering leak and cross-
  contamination cases in both directions

2-3x faster on arithmetic- and Reduce-heavy expressions. No
behavior change.
@MartinsMednis
MartinsMednis merged commit 641b61c into main Sep 14, 2026
2 checks passed
@MartinsMednis
MartinsMednis deleted the stage4-lazy-scope-copy branch September 21, 2026 17:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant