为什么列表推导式会在内部创建一个函数?

问题描述 投票:0回答:1

这是 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
的代码对象,它执行实际的迭代并返回结果列表,并立即调用它。 我无法理解需要创建一个单独的函数来执行这项工作。这是一种优化技巧吗?

python list-comprehension python-internals
1个回答
0
投票

创建函数的主要逻辑是隔离推导式的迭代变量。但运行时效率很低。 因为这个原因,Python 3.12 实现了理解内联,它将不再创建单独的代码对象

© www.soinside.com 2019 - 2024. All rights reserved.