mirror of
https://github.com/python/cpython.git
synced 2025-10-28 17:13:08 +00:00
gh-87729: add LOAD_SUPER_ATTR instruction for faster super() (#103497)
This speeds up `super()` (by around 85%, for a simple one-level `super().meth()` microbenchmark) by avoiding allocation of a new single-use `super()` object on each use.
This commit is contained in:
parent
22bed58e53
commit
0dc8b50d33
18 changed files with 783 additions and 408 deletions
|
|
@ -1036,6 +1036,24 @@ iterations of the loop.
|
|||
pushed to the stack before the attribute or unbound method respectively.
|
||||
|
||||
|
||||
.. opcode:: LOAD_SUPER_ATTR (namei)
|
||||
|
||||
This opcode implements :func:`super` (e.g. ``super().method()`` and
|
||||
``super().attr``). It works the same as :opcode:`LOAD_ATTR`, except that
|
||||
``namei`` is shifted left by 2 bits instead of 1, and instead of expecting a
|
||||
single receiver on the stack, it expects three objects (from top of stack
|
||||
down): ``self`` (the first argument to the current method), ``cls`` (the
|
||||
class within which the current method was defined), and the global ``super``.
|
||||
|
||||
The low bit of ``namei`` signals to attempt a method load, as with
|
||||
:opcode:`LOAD_ATTR`.
|
||||
|
||||
The second-low bit of ``namei``, if set, means that this was a two-argument
|
||||
call to :func:`super` (unset means zero-argument).
|
||||
|
||||
.. versionadded:: 3.12
|
||||
|
||||
|
||||
.. opcode:: COMPARE_OP (opname)
|
||||
|
||||
Performs a Boolean operation. The operation name can be found in
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue