以下两种选择中的哪一种更有效?有什么建议可以进一步改善吗?
备选方案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秒)快(数字是平均值)。
答案 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)
对于性能不是绝对关键的代码,请问自己“哪个更容易理解”并将其作为答案。只需几微秒的差异就不值得花时间在脚本代码中烦恼。