【问题标题】:Loop while checking if element in a list in Python在Python中检查列表中的元素时循环
【发布时间】:2023-03-03 01:21:02
【问题描述】:

假设我有这样一段简单的代码:

for i in range(1000):
    if i in [150, 300, 500, 750]:
        print(i)

列表[150, 300, 500, 750] 是否在循环的每次迭代中创建?或者我可以假设解释器(比如 CPython 2.7)足够聪明,可以优化它吗?

【问题讨论】:

  • 有趣的相关问题:Tuple or list when using 'in' in an 'if' clause?。详细介绍了 CPython 在幕后所做的工作。
  • 除非您指定您想了解 1 个特定 解释器,否则这很难回答。你能改写“(比如,CPython 2.7)”来指明你想确切地了解那个解释器吗?

标签: python python-2.7 loops python-3.x interpreter


【解决方案1】:

您可以使用dis.dis 查看字节码。这是 CPython 2.7.11 的输出:

  2           0 SETUP_LOOP              40 (to 43)
              3 LOAD_GLOBAL              0 (range)
              6 LOAD_CONST               1 (1000)
              9 CALL_FUNCTION            1
             12 GET_ITER            
        >>   13 FOR_ITER                26 (to 42)
             16 STORE_FAST               0 (i)

  3          19 LOAD_FAST                0 (i)
             22 LOAD_CONST               6 ((150, 300, 500, 750))
             25 COMPARE_OP               6 (in)
             28 POP_JUMP_IF_FALSE       13

  4          31 LOAD_FAST                0 (i)
             34 PRINT_ITEM          
             35 PRINT_NEWLINE       
             36 JUMP_ABSOLUTE           13
             39 JUMP_ABSOLUTE           13
        >>   42 POP_BLOCK           
        >>   43 LOAD_CONST               0 (None)
             46 RETURN_VALUE      

因此,列表创建针对常量元组(字节 22)的加载进行了优化。列表(在这种情况下实际上是一个元组)不会在每次迭代时重新创建。

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2014-01-08
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多