python中的for循环中的基本步骤数

时间:2018-10-07 11:06:01

标签: python python-3.x algorithm

我正在阅读有关算法的复杂性。我有一个代码可以用来告诉它原始操作的数量。

sum_res = 0     #1
for num in num_list:  # 5 * n + 2
    sum_res += num   #  n * 1
mean = sum_res / len(num_list) # 3

我知道第1行是1操作。第3行是1个操作,但是因为它已经执行了n次,所以总共使它成为n个操作。最后一行是3次操作。但我不明白为什么循环 5 * n + 2

如果有人能为我分解它,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我不确定您的教练从哪里得到这些数字。如果要查看基于堆栈的Python虚拟机为一段代码执行的原始操作,可以使用dis.dis函数。

从文档中

  

dis.dis(x=None, *, file=None, depth=None)

     

反汇编x对象。 x可以表示模块,类,   方法,函数,生成器,异步生成器,   协程,代码对象,源代码字符串或字节序列   原始字节码。对于模块,它将分解所有功能。为一个   类,它将分解所有方法(包括类和静态方法)   方法)。对于代码对象或原始字节码序列,它将输出一个   每字节代码指令行。它还以递归方式反汇编嵌套   代码对象(理解代码,生成器表达式和   嵌套函数,以及用于构建嵌套类的代码)。   首先使用内置的compile()将字符串编译为代码对象   拆卸前的功能。如果未提供任何对象,则此   函数反汇编最后的回溯。

我们可以将您的代码放入字符串中,然后将其传递给dis.dis

from dis import dis

src = '''\
sum_res = 0
for num in num_list:
    sum_res += num
mean = sum_res / len(num_list)
'''
dis(src)

输出

  1           0 LOAD_CONST               0 (0)
              2 STORE_NAME               0 (sum_res)

  2           4 SETUP_LOOP              20 (to 26)
              6 LOAD_NAME                1 (num_list)
              8 GET_ITER
        >>   10 FOR_ITER                12 (to 24)
             12 STORE_NAME               2 (num)

  3          14 LOAD_NAME                0 (sum_res)
             16 LOAD_NAME                2 (num)
             18 INPLACE_ADD
             20 STORE_NAME               0 (sum_res)
             22 JUMP_ABSOLUTE           10
        >>   24 POP_BLOCK

  4     >>   26 LOAD_NAME                0 (sum_res)
             28 LOAD_NAME                3 (len)
             30 LOAD_NAME                1 (num_list)
             32 CALL_FUNCTION            1
             34 BINARY_TRUE_DIVIDE
             36 STORE_NAME               4 (mean)
             38 LOAD_CONST               1 (None)
             40 RETURN_VALUE

希望您可以大致了解那里的情况,但是请参阅dis文档以了解各种说明的含义。