这是 python 3.10 中列表理解的反汇编:
Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>>
>>> dis.dis("[True for _ in ()]")
1 0 LOAD_CONST 0 (<code object <listcomp> at 0x7fea68e0dc60, file "<dis>", line 1>)
2 LOAD_CONST 1 ('<listcomp>')
4 MAKE_FUNCTION 0
6 LOAD_CONST 2 (())
8 GET_ITER
10 CALL_FUNCTION 1
12 RETURN_VALUE
Disassembly of <code object <listcomp> at 0x7fea68e0dc60, file "<dis>", line 1>:
1 0 BUILD_LIST 0
2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 4 (to 14)
6 STORE_FAST 1 (_)
8 LOAD_CONST 0 (True)
10 LIST_APPEND 2
12 JUMP_ABSOLUTE 2 (to 4)
>> 14 RETURN_VALUE
据我了解,它创建了一个名为的代码对象listcomp
,该对象执行实际迭代并返回结果列表,并立即调用它。我无法理解需要创建一个单独的函数来执行这项工作。这是一种优化技巧吗?
创建函数的主要逻辑是隔离推导式的迭代变量peps.python.org。通过创建一个函数:
但运行时效率很低。因此,python-3.12实现了一项称为理解内联(PEP 709)peps.python.org 的优化,它将不再创建单独的代码对象peps.python.org。
这是使用python-3.12反汇编的相同代码的输出(如您所见,不再有
MAKE_FUNCTION
操作码)