gpt4 book ai didi

Python:for循环+break与while+flag性能

转载 作者:行者123 更新时间:2023-12-01 01:13:19 26 4
gpt4 key购买 nike

如果我们想在循环中使用 return 语句,我们的编程老师建议使用 while 循环而不是 for 循环,前提是“当你给它一个表时,Python 通过展开它来优化 for 循环,所以如果你在中间放一个 return ,它将浪费内存和时间”。

我已经使用 Python 好几年了,根据 Python 规范,我可以肯定地说这是错误的(如果循环体“简单”,则循环展开仅由 CPython 完成)。

基本上他是说这段代码:

def check_five(tab):
for elem in tab:
if elem > 5:
return True
return False

会导致性能问题,应替换为

def check_five(tab):
i = 0
found = False
while i < len(tab) and not found:
if tab[i] > 5:
found = True
i += 1
return found

这既不那么Python化,又更加臃肿。

我做了一些基准测试,whilefor 慢 3 倍左右。

他的推理有道理吗? (是否有任何边缘情况是正确的?)

注意:不是关于何时使用for循环或while循环的问题,这是一个关于双方表现的问题。我也知道使用 any() 编写此代码的更好方法,但遗憾的是我们只允许使用我们在类里面已经介绍过的内容。我们还使用 Python 3。

最佳答案

只需向老师展示 dis 的输出(无双关语)。

from dis import dis

def for_check_five(tab):
for elem in tab:
if elem > 5:
return True
return False


def while_check_five(tab):
i = 0
found = False
while i < len(tab) and not found:
if tab[i] > 5:
found = True
i += 1
return found


dis(for_check_five)
print()
print('--------------')
print()
dis(while_check_five)

输出

104           0 SETUP_LOOP              24 (to 26)
2 LOAD_FAST 0 (tab)
4 GET_ITER
>> 6 FOR_ITER 16 (to 24)
8 STORE_FAST 1 (elem)

105 10 LOAD_FAST 1 (elem)
12 LOAD_CONST 1 (5)
14 COMPARE_OP 4 (>)
16 POP_JUMP_IF_FALSE 6

106 18 LOAD_CONST 2 (True)
20 RETURN_VALUE
22 JUMP_ABSOLUTE 6
>> 24 POP_BLOCK

107 >> 26 LOAD_CONST 3 (False)
28 RETURN_VALUE

--------------

111 0 LOAD_CONST 1 (0)
2 STORE_FAST 1 (i)

112 4 LOAD_CONST 2 (False)
6 STORE_FAST 2 (found)

113 8 SETUP_LOOP 44 (to 54)
>> 10 LOAD_FAST 1 (i)
12 LOAD_GLOBAL 0 (len)
14 LOAD_FAST 0 (tab)
16 CALL_FUNCTION 1
18 COMPARE_OP 0 (<)
20 POP_JUMP_IF_FALSE 52
22 LOAD_FAST 2 (found)
24 POP_JUMP_IF_TRUE 52

114 26 LOAD_FAST 0 (tab)
28 LOAD_FAST 1 (i)
30 BINARY_SUBSCR
32 LOAD_CONST 3 (5)
34 COMPARE_OP 4 (>)
36 POP_JUMP_IF_FALSE 42

115 38 LOAD_CONST 4 (True)
40 STORE_FAST 2 (found)

116 >> 42 LOAD_FAST 1 (i)
44 LOAD_CONST 5 (1)
46 INPLACE_ADD
48 STORE_FAST 1 (i)
50 JUMP_ABSOLUTE 10
>> 52 POP_BLOCK

117 >> 54 LOAD_FAST 2 (found)
56 RETURN_VALUE

向老师展示 while 循环还需要完成多少工作。您所掌握的分析数据应该能让您和您的老师相信谁是正确的。

关于Python:for循环+break与while+flag性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54615813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com