2024-04-26 20:55:24 发布
网友
如LOAD_FAST。LOAD_CONST是显而易见的。或者fast只是“fast”的意思,是一个。。加载局部变量的快速方法?你知道吗
LOAD_FAST
LOAD_CONST
LOAD_FAST用于局部变量,通过索引访问数组中的值。这比使用LOAD_NAME(从当前函数对象向外搜索所有作用域)按名称访问字典中的变量值要快。你知道吗
LOAD_NAME
在python2中,可以通过使用数组来优化函数局部变量,也可以动态添加局部变量并要求使用LOAD_NAME。如果将^{} statement与locals()一起使用,则无法优化局部变量,因为exec可能会添加任意局部变量,而Python无法知道它们是局部变量还是应被视为全局变量:
locals()
exec
>>> 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:
function.__code__.co_flags
>>> 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__映射,例如:
__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
LOAD_FAST
用于局部变量,通过索引访问数组中的值。这比使用LOAD_NAME
(从当前函数对象向外搜索所有作用域)按名称访问字典中的变量值要快。你知道吗在python2中,可以通过使用数组来优化函数局部变量,也可以动态添加局部变量并要求使用} statement 与
LOAD_NAME
。如果将^{locals()
一起使用,则无法优化局部变量,因为exec
可能会添加任意局部变量,而Python无法知道它们是局部变量还是应被视为全局变量:这也反映在} bit :
function.__code__.co_flags
标志变量中,设置^{在python3中,删除了
exec
语句后,局部变量总是被优化的,您不再能够动态地设置局部变量。你知道吗LOAD_NAME
仍在python3中使用,但从未在关键代码中使用。为创建类对象而生成的字节码在使用variable annotation时使用LOAD_NAME
访问__annotations__
映射,例如:相关问题 更多 >
编程相关推荐