Uh oh!
There was an error while loading. Please reload this page.
bpo-42202: Store func annotations as single tuple at bytecode level - #23316
Conversation
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
bedevere-bot
commented
Nov 16, 2020
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 |
uriyyo
commented
Nov 17, 2020
@serhiy-storchaka I have implemented the same logic for module and class annotations, so all annotations will be computed at compilation time. |
a4d717f to
d1f7312CompareUh oh!
There was an error while loading. Please reload this page.
uriyyo
commented
Nov 17, 2020
I have made the requested changes; please review again |
bedevere-bot
commented
Nov 17, 2020
Thanks for making the requested changes! @serhiy-storchaka: please review the changes made to this pull request. |
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>
markshannon
commented
Nov 24, 2020
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, intcompiler_visit_argannotation(structcompiler*c, identifierid, expr_tyannotation, Py_ssize_t*annotations_len);becomes intcompiler_visit_argannotation(structcompiler*c, identifierid, expr_tyannotation);and the use changes from if (compiler_visit_argannotation(..., &len))
goto error;to len=compiler_visit_argannotation(...);
if (len<0)
goto error; |
uriyyo
commented
Nov 24, 2020
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? |
markshannon
commented
Nov 24, 2020
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. |
uriyyo
commented
Nov 24, 2020
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))
return0;
if (args->vararg&&args->vararg->annotation&&
!compiler_visit_argannotation(c, args->vararg->arg,
args->vararg->annotation, &annotations_len))
return0;It will be rewritten to: len=compiler_visit_argannotations(c, args->args);
if (len<0)
return0;
annotations_len+=len;
if (args->vararg&&args->vararg->annotation) {
len=compiler_visit_argannotation(c, args->vararg->arg,
args->vararg->annotation);
if (len<0)
return0;
annotations_len+=len;
}This situation is a double-edged sword when we should choose between code readability and code explicity. |
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.
Uh oh!
There was an error while loading. Please reload this page.
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. |
uriyyo
commented
Nov 24, 2020
Can someone rerun Azure Pipelines? |
methane
commented
Nov 25, 2020
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. |
uriyyo
commented
Nov 25, 2020
@methane Looks like everything is done and this PR can be merged |
methane
commented
Nov 25, 2020
I did |
uriyyo
commented
Nov 25, 2020
Sure, no problems. |
uriyyo
commented
Nov 25, 2020
@methane I have regenerated |
methane
commented
Nov 25, 2020
Congrats, @uriyyo. And thank you reviewers. |
uriyyo
commented
Nov 25, 2020
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 <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