在python字节码中,fast代表什么?

2024-04-26 20:55:24 发布

您现在位置:Python中文网/ 问答频道 /正文

LOAD_FASTLOAD_CONST是显而易见的。或者fast只是“fast”的意思,是一个。。加载局部变量的快速方法?你知道吗


Tags: 方法loadfast局部变量const
1条回答
网友
1楼 · 发布于 2024-04-26 20:55:24

LOAD_FAST用于局部变量,通过索引访问数组中的值。这比使用LOAD_NAME(从当前函数对象向外搜索所有作用域)按名称访问字典中的变量值要快。你知道吗

在python2中,可以通过使用数组来优化函数局部变量,也可以动态添加局部变量并要求使用LOAD_NAME。如果将^{} statementlocals()一起使用,则无法优化局部变量,因为exec可能会添加任意局部变量,而Python无法知道它们是局部变量还是应被视为全局变量:

>>> def optimised(bar): return bar
...
>>> dis.dis(optimised)
  1           0 LOAD_FAST                0 (bar)
              3 RETURN_VALUE
>>> def not_optimised(bar):
...     exec bar
...     return spam  # global, or local? Python can't know
...
>>> not_optimised("spam = 42")
42
>>> not_optimised("ham = 'no spam!'")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in not_optimised
NameError: name 'spam' is not defined
>>> dis.dis(not_optimised)
  2           0 LOAD_FAST                0 (bar)
              3 LOAD_CONST               0 (None)
              6 DUP_TOP
              7 EXEC_STMT

  3           8 LOAD_NAME                0 (spam)
             11 RETURN_VALUE

这也反映在function.__code__.co_flags标志变量中,设置^{} bit

>>> import inspect
>>> bool(optimised.__code__.co_flags & inspect.CO_OPTIMIZED)
True
>>> bool(not_optimised.__code__.co_flags & inspect.CO_OPTIMIZED)
False

在python3中,删除了exec语句后,局部变量总是被优化的,您不再能够动态地设置局部变量。你知道吗

LOAD_NAME仍在python3中使用,但从未在关键代码中使用。为创建类对象而生成的字节码在使用variable annotation时使用LOAD_NAME访问__annotations__映射,例如:

>>> import dis
>>> dis.dis("class Foo:\n    bar: int\n")
  1           0 LOAD_BUILD_CLASS
              2 LOAD_CONST               0 (<code object Foo at 0x10e050df0, file "<dis>", line 1>)
              4 LOAD_CONST               1 ('Foo')
              6 MAKE_FUNCTION            0
              8 LOAD_CONST               1 ('Foo')
             10 CALL_FUNCTION            2
             12 STORE_NAME               0 (Foo)
             14 LOAD_CONST               2 (None)
             16 RETURN_VALUE

Disassembly of <code object Foo at 0x10e050df0, file "<dis>", line 1>:
  1           0 LOAD_NAME                0 (__name__)
              2 STORE_NAME               1 (__module__)
              4 LOAD_CONST               0 ('Foo')
              6 STORE_NAME               2 (__qualname__)
              8 SETUP_ANNOTATIONS

  2          10 LOAD_NAME                3 (int)
             12 LOAD_NAME                4 (__annotations__)
             14 LOAD_CONST               1 ('bar')
             16 STORE_SUBSCR
             18 LOAD_CONST               2 (None)
             20 RETURN_VALUE

相关问题 更多 >