循环控制,更有效

时间:2010-11-04 21:30:01

标签: python performance loops

以下两种选择中的哪一种更有效?有什么建议可以进一步改善吗?

备选方案A:

for i in BAR_Items:
    if BAR_Items[i] != A and SHAPE[i+"_SHP"] != A: continue
    if i in Selection:
        Selection.remove(i)
        BAR_Items[i].clearActions()
        BAR_Items[i].add(vizact.spinTo(axisAngle=[0,1,0,90],speed=300))
        VFrame.SetStatusText(frame, i + " has been deselected. "+ str(Selection))
    else:
        Selection.append(i)
        BAR_Items[i].add(vizact.spin(0,1,0,90,viz.FOREVER))
        VFrame.SetStatusText(frame, i + " selected. " + str(Selection))
    break

备选方案B:

for i in BAR_Items:
    if BAR_Items[i] == A or SHAPE[i+"_SHP"] == A:
        if i in Selection:
            Selection.remove(i)
            BAR_Items[i].clearActions()
            BAR_Items[i].add(vizact.spinTo(axisAngle=[0,1,0,90],speed=300))
            VFrame.SetStatusText(frame, i + " has been deselected. "+ str(Selection))
        else:
            Selection.append(i)
            BAR_Items[i].add(vizact.spin(0,1,0,90,viz.FOREVER))
            VFrame.SetStatusText(frame, i + " selected. " + str(Selection))
        break

好的,我按照这些建议找到了计时方法。测量500次后,B(0.001279264秒)平均比A(0.001966169秒)快(数字是平均值)。

3 个答案:

答案 0 :(得分:5)

测试效率的最佳方法之一是使用timeit模块。我会将每个替代项放在一个函数中,在每个函数上运行timeit,并进行比较。

答案 1 :(得分:3)

好的,这是一种看待表现的人为方式。因为我们试图看到使用“继续”或在“if block ..”中拉代码之间的区别

这是一个小实验。

def f():
    x = {'a':'b', 'c':'d', 'e':'d'}
    for l in x:
        if x[l] != 'd': continue
        print x

def f1():
    x = {'a':'b', 'c':'d', 'e':'d'}
    for l in x:
        if x[l] == 'd':
            print x       

import dis
print dis.dis(f)   
print dis.dis(f1)  

大多数操作都是相同的,这里有一点不同:

如果是f:

56 POP_TOP             
57 JUMP_ABSOLUTE           34
60 JUMP_FORWARD             1 (to 64)
63 POP_TOP             

64 LOAD_FAST                0 (x)
67 PRINT_ITEM          
68 PRINT_NEWLINE       
69 JUMP_ABSOLUTE           34
72 POP_BLOCK           
73 LOAD_CONST               0 (None)
76 RETURN_VALUE  

如果是f1:

56 POP_TOP             

57 LOAD_FAST                0 (x)
60 PRINT_ITEM          
61 PRINT_NEWLINE       
62 JUMP_ABSOLUTE           34
65 POP_TOP             
66 JUMP_ABSOLUTE           34
69 POP_BLOCK           
70 LOAD_CONST               0 (None)
73 RETURN_VALUE 

<强>判决

只有一个OP差异。真的不太对劲。有相同的。根据可读性而非性能做出决定。

答案 2 :(得分:0)

对于性能不是绝对关键的代码,请问自己“哪个更容易理解”并将其作为答案。只需几微秒的差异就不值得花时间在脚本代码中烦恼。

相关问题