-
-
Notifications
You must be signed in to change notification settings - Fork 31.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpo-42202: Store func annotations as single tuple at bytecode level #23316
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM in general.
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
@serhiy-storchaka I have implemented the same logic for module and class annotations, so all annotations will be computed at compilation time. |
a4d717f
to
d1f7312
Compare
I have made the requested changes; please review again |
Thanks for making the requested changes! @serhiy-storchaka: please review the changes made to this pull request. |
Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Serhiy Storchaka <[email protected]>
d1f7312
to
da237df
Compare
240166c
to
c12fc1c
Compare
Rather than return the tuple size via a pointer (out) parameter, you can return the size directly as it cannot be negative, leaving -1 to signify an error. So, int compiler_visit_argannotation(struct compiler *c, identifier id, expr_ty annotation, Py_ssize_t *annotations_len); becomes int compiler_visit_argannotation(struct compiler *c, identifier id, expr_ty annotation); and the use changes from if (compiler_visit_argannotation(..., &len))
goto error; to len = compiler_visit_argannotation(...);
if (len < 0)
goto error; |
I think it will make code more complicated because it will require rewriting all ifs for It will be great if @markshannon What is your opinion regarding that? |
I prefer my approach (I wouldn't have suggested it otherwise 🙂 ), but the code is fine as it is. I'm still happy with merging it. |
I totally agree with you, personally, I don't like when the return value passed through the pointer instead of simple return, as zen said But otherwise, In my opinion, it will make code less readable. if (!compiler_visit_argannotations(c, args->args, &annotations_len))
return 0;
if (args->vararg && args->vararg->annotation &&
!compiler_visit_argannotation(c, args->vararg->arg,
args->vararg->annotation, &annotations_len))
return 0; It will be rewritten to: len = compiler_visit_argannotations(c, args->args);
if (len < 0)
return 0;
annotations_len += len;
if (args->vararg && args->vararg->annotation) {
len = compiler_visit_argannotation(c, args->vararg->arg,
args->vararg->annotation);
if (len < 0)
return 0;
annotations_len += len;
} This situation is a double-edged sword when we should choose between code readability and code explicity. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't have anything valuable to add here, just a small nitpick with the whatsnew.
This optimization makes me really happy :). Thanks Yuri for the PR and Inada-san for the concept.
Co-authored-by: kj <[email protected]>
@Fidget-Spinner Thank you for making docs more clear and for adding Inada to the list of contributors. It's my bad, I must definitely add Inada to the contributor's list because this PR is fully his idea. |
Can someone rerun Azure Pipelines? |
Even core committers can not re-run Azure Pipeline. Close and reopen is the most easy way to rebuild, although it starts not only Azure Pipeline. |
@methane Looks like everything is done and this PR can be merged |
I did |
Sure, no problems. |
@methane I have regenerated |
Congrats, @uriyyo. And thank you reviewers. |
Thanks all, I am happy that we merge this PR💫 @methane Should we do smth similar for class/module annotations? |
Reduce memory footprint and improve performance of loading modules having many func annotations. >>> sys.getsizeof({"a":"int","b":"int","return":"int"}) 232 >>> sys.getsizeof(("a","int","b","int","return","int")) 88 The tuple is converted into dict on the fly when `func.__annotations__` is accessed first. Co-authored-by: Serhiy Storchaka <[email protected]> Co-authored-by: Inada Naoki <[email protected]>
Store func annotations as single tuple at bytecode level.
https://bugs.python.org/issue42202