我正在阅读有关算法的复杂性。我有一个代码可以用来告诉它原始操作的数量。
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
如果有人能为我分解它,我将不胜感激。
答案 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
文档以了解各种说明的含义。