-
-
Notifications
You must be signed in to change notification settings - Fork 31k
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
gh-77273: Better bytecodes for f-strings #6132
Conversation
554c1b6
to
d79893a
Compare
35dea3c
to
6a88b26
Compare
Any update on this @taleinat suggested sharing benchmarks here https://bugs.python.org/issue33092. Otherwise due to lack of activity I think we can close this. |
6a88b26
to
cc0f91e
Compare
cc0f91e
to
7c1f2a6
Compare
This PR is stale because it has been open for 30 days with no activity. |
CC: @rhettinger @ambv |
7c1f2a6
to
3af4084
Compare
Updated to use the new bytecode definition format. Removes the conditional stack effect, simplifying tooling around these instructions. |
Looks like you missed out the doc update. |
argval = (None, str, repr, ascii)[arg] | ||
argrepr = ('', 'str', 'repr', 'ascii')[arg] |
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.
since oparg 0 isn't a thing (right?), maybe write this as:
argval = (None, str, repr, ascii)[arg] | |
argrepr = ('', 'str', 'repr', 'ascii')[arg] | |
argval = (_, str, repr, ascii)[arg] | |
argrepr = (_, 'str', 'repr', 'ascii')[arg] |
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.
What is _
? We might not use the 0th item, but it still needs to be defined.
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.
IIUC _ is the convention for ‘unused value’.
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.
For lvalues, sure, but this is an rvalue.
* main: (57 commits) pythongh-105831: Fix NEWS blurb from pythongh-105828 (python#105833) pythongh-105820: Fix tok_mode expression buffer in file & readline tokenizer (python#105828) pythongh-105751, test_ctypes: Remove disabled tests (python#105826) pythongh-105821: Use a raw f-string in test_httpservers.py (python#105822) pythongh-105751: Remove platform usage in test_ctypes (python#105819) pythongh-105751: Reenable disable test_ctypes tests (python#105818) pythongh-105751: Remove dead code in test_ctypes (python#105817) More reorganisation of the typing docs (python#105787) Improve docs for `typing.dataclass_transform` (python#105792) pythonGH-89812: Churn `pathlib.Path` test methods (python#105807) pythongh-105800: Issue SyntaxWarning in f-strings for invalid escape sequences (python#105801) pythongh-105751: Cleanup test_ctypes imports (python#105803) pythongh-105481: add HAS_JUMP flag to opcode metadata (python#105791) pythongh-105751: test_ctypes avoids the operator module (pythonGH-105797) pythongh-105751: test_ctypes: Remove @need_symbol decorator (pythonGH-105798) pythongh-104909: Implement conditional stack effects for macros (python#105748) pythongh-75905: Remove test_xmlrpc_net: skipped since 2017 (python#105796) pythongh-105481: Fix types and a bug for pseudos (python#105788) Update DSL docs for cases generator (python#105753) pythonGH-77273: Better bytecodes for f-strings (pythonGH-6132) ...
Simplify and speed up interpreter for f-strings.
tldr; Do work in the compiler instead of the interpreter.
Splits the FORMAT_VALUE opcode into CONVERT_VALUE, FORMAT_SIMPLE and FORMAT_WITH_SPEC.
The compiler can then emit the optimal sequence for each format expression.
The three new opcodes are much simpler than the one they replace, actually removing a few lines of code from the interpreter.
The CONVERT_VALUE is emitted only if a conversion is present.
In the standard library only (approx) 20% of f-strings include a conversion.
FORMAT_WITH_SPEC is emitted if a format specifier is present.
Otherwise FORMAT_SIMPLE is emitted.
In the standard library about 70% of format expressions can be formatted with just the simple (and fast)
FORMAT_SIMPLE opcode.
https://bugs.python.org/issue33092