bpo-42202: Store func annotations as single tuple at bytecode level#23316
bpo-42202: Store func annotations as single tuple at bytecode level#23316methane merged 33 commits into
Conversation
serhiy-storchaka
left a comment
There was a problem hiding this comment.
LGTM in general.
Sorry, something went wrong.
|
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 |
Sorry, something went wrong.
|
@serhiy-storchaka I have implemented the same logic for module and class annotations, so all annotations will be computed at compilation time. |
Sorry, something went wrong.
a4d717f to
d1f7312
Compare
November 17, 2020 15:38
|
I have made the requested changes; please review again |
Sorry, something went wrong.
|
Thanks for making the requested changes! @serhiy-storchaka: please review the changes made to this pull request. |
Sorry, something went wrong.
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
d1f7312 to
da237df
Compare
November 17, 2020 20:17
240166c to
c12fc1c
Compare
November 24, 2020 10:15
|
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; |
Sorry, something went wrong.
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? |
Sorry, something went wrong.
|
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. |
Sorry, something went wrong.
|
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. |
Sorry, something went wrong.
Fidget-Spinner
left a comment
There was a problem hiding this comment.
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.
Sorry, something went wrong.
Co-authored-by: kj <28750310+Fidget-Spinner@users.noreply.github.com>
|
@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. |
Sorry, something went wrong.
|
Can someone rerun Azure Pipelines? |
Sorry, something went wrong.
|
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. |
Sorry, something went wrong.
|
@methane Looks like everything is done and this PR can be merged |
Sorry, something went wrong.
|
I did |
Sorry, something went wrong.
Sure, no problems. |
Sorry, something went wrong.
|
Thanks all, I am happy that we merge this PR💫 @methane Should we do smth similar for class/module annotations? |
Sorry, something went wrong.
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 <storchaka@gmail.com>
Co-authored-by: Inada Naoki <songofacandy@gmail.com>
Store func annotations as single tuple at bytecode level.
https://bugs.python.org/issue42202