Skip to content

Avoid building typing generics at runtime in cast() calls - #203

Open
Shamsidinkhon wants to merge 1 commit into
cloud-custodian:mainfrom
Shamsidinkhon:main
Open

Shamsidinkhon wants to merge 1 commit into
cloud-custodian:mainfrom
Shamsidinkhon:main

Conversation

@Shamsidinkhon

Copy link
Copy Markdown

evaluation.py calls typing.cast(X[...], value) on the evaluator's hot paths: comparisons, &&/||, unary operators, variable resolution, list/map literals and macros. cast() returns its value unchanged, but Python still evaluates the first argument on every call, so the subscripted type is rebuilt each time a node is visited.

Rebuilding is expensive when the type contains Result or celtypes.Value. Subscripting a generic goes through typing's internal lru_cache, and even a cache hit has to hash the arguments. Union, generic aliases and ForwardRef all implement hash in pure Python and don't store the result. Result is a 26-member union of 11 ForwardRefs, 14 Type[ForwardRef(...)] and two classes. So one hash(Result) makes 38 Python-level hash calls, and Tuple[Result, Result] makes 76.

This branch has not been deployed

No deployments
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