Python:多次调用 "for num in foo()"循环中的函数 foo()?

标签 python python-3.x for-loop

每次重复循环时都会调用 foo() 吗?

for num in foo():
    # Do something

如果这样效率低下,这段代码是否更好?

l = foo()
for num in l:
    # Do something

最佳答案

没有。在这两种情况下,foo() 都只被调用一次。预计前者会比后者稍快一些。另外,list 是内置函数/类型的名称,您不应将其用作变量名称。

<小时/>

您可以使用Python字节码反汇编器dis.dis找出 CPython 生成的字节码:

>>> import dis
>>> dis.dis(compile('for num in foo():pass', '', 'exec'))
  1           0 SETUP_LOOP              17 (to 20)
              3 LOAD_NAME                0 (foo)
              6 CALL_FUNCTION            0 (0 positional, 0 keyword pair)
              9 GET_ITER
        >>   10 FOR_ITER                 6 (to 19)
             13 STORE_NAME               1 (num)
             16 JUMP_ABSOLUTE           10
        >>   19 POP_BLOCK
        >>   20 LOAD_CONST               0 (None)
             23 RETURN_VALUE

在上面的字节码中,循环体从 10 FOR_ITER 开始,一直持续到 19 POP_BLOCK。比较:

>>> dis.dis(compile('l = foo()\nfor num in list:pass', '', 'exec'))
  1           0 LOAD_NAME                0 (foo)
              3 CALL_FUNCTION            0 (0 positional, 0 keyword pair)
              6 STORE_NAME               1 (l)

  2           9 SETUP_LOOP              14 (to 26)
             12 LOAD_NAME                1 (l)
             15 GET_ITER
        >>   16 FOR_ITER                 6 (to 25)
             19 STORE_NAME               2 (num)
             22 JUMP_ABSOLUTE           16
        >>   25 POP_BLOCK
        >>   26 LOAD_CONST               0 (None)
             29 RETURN_VALUE

这里循环体从位置 16 开始,一直持续到 25。循环体的字节码是相同的;唯一的区别是额外的操作码 STORE_NAMEfoo() 的返回值存储到 list 中,以及额外的 LOAD_NAME > 从 list 中检索值。

关于Python:多次调用 "for num in foo()"循环中的函数 foo()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36594326/

相关文章:

python - 在for循环中增加x的值

python - 在 jupyter notebook 中显示 scikit 决策 TreeMap

netbeans 中的 php xdebug - 如何查看变量的值?

python 3 : zip in range

python-3.x - 从 Python 的 http.server 提供文件 - 使用文件正确响应

python - 在 Statsmodels RegressionResults 中调用对数似然?

javascript - 如何为 JavaScript 创建的每个 DIV 制作不同的 insideText?

python - For循环调用urllib.urlopen().getcode()很慢

python - 为什么我的 python 程序输出中有额外的空行?

python xlsxwriter根据行数据写入单元格