以下两种选择中哪一种更有效?有什么建议可以进一步改善吗?
备选方案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秒)平均(数字是平均值)要快。
最佳答案
好的,这是一种查看性能的人为方式。由于我们试图看到使用“ continue”或将代码插入“ 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差异。真的不是很对。有等效的。您的决策基于可读性而不是性能。