我最近才知道python没有switch/case语句。我一直在阅读有关使用字典代替它,像这样的例子:Python字典代替开关/外壳
values = {
value1: do_some_stuff1,
value2: do_some_stuff2,
valueN: do_some_stuffN,
}
values.get(var, do_default_stuff)()
我想不通的是如何应用此做了一系列的测试。因此,而不是做一些东西,如果value1=4
说,做了一些东西,如果value1<4.
因此,像这样(我知道不工作)的:
values = {
if value1 <val: do_some_stuff1,
if value2 >val: do_some_stuff2,
}
values.get(var, do_default_stuff)()
我试着如果/ elif的/ else语句这样做。它工作正常,但它似乎比我根本不需要if语句的情况要慢得多(这可能是明显不可避免的)。因此,这里是我的代码与if/elif的/ else语句:
if sep_ang(val1,val2,X,Y)>=ROI :
main.removeChild(source)
elif sep_ang(val1,val2,X,Y)<=5.0:
integral=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
index=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
print name,val1,val2,sep_ang(val1,val2,X,Y),integral,index
print >> reg,'fk5;point(',val1,val2,')# point=cross text={',name,'}'
else:
spectrum[0].getElementsByTagName("parameter")[0].setAttribute("free","0") #Integral
spectrum[0].getElementsByTagName("parameter")[1].setAttribute("free","0") #Index
integral=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
index=float(spectrum[0].getElementsByTagName("parameter")[0].getAttribute("free"))
print name,val1,val2,sep_ang(val1,val2,X,Y),integral,index
print >> reg,'fk5;point(',val1,val2,')# point=cross text={',name,'}'
这需要接近5分钟检查约1500 VAR sep_ang的值。在哪里,如果我不希望使用的setAttribute()来改变基于sep_ang的价值我的XML文件中的值,我用这个,如果其他简单:
if sep_ang(val1,val2,X,Y)>=ROI :
main.removeChild(source)
else:
print name,val1,val2,ang_sep(val1,val2,X,Y);print >> reg,'fk5;point(',val1,val2,')# point
其中仅需要30秒〜。我再次明白,添加elif语句和更改该属性的值可能会不可避免地增加我的代码的执行时间,我只是很好奇它是否有解决方法。
编辑: 在我的情况下,使用bisect而不是if/elif语句的好处是,它可以比使用一堆elif语句更快地检查某个范围内的值吗?
看来我仍然需要使用elif语句。像这样,例如:
range=[10,100]
options='abc'
def func(val)
return options[bisect(range, val)]
if func(val)=a:
do stuff
elif func(val)=b:
do other stuff
else:
do other other stuff
那么,我的elif语句只是检查一个单一的值。
非常感谢您的帮助,非常感谢。
您是否将14行代码与四行代码进行比较?你问为什么14行代码可能比4行代码慢? – 2010-02-08 18:57:17
当然我知道14行代码的运行时间比4行代码的运行时间要长(这就是为什么我说它可能是显而易见且不可避免的,它运行得更慢)。我认为这不仅仅是因为一些代码比另一个代码多了10行,它应该慢10倍。我认为用我的代码大大减缓它的事情是,每个elif语句都必须检查我的ang_sep变量的1500左右的值。我知道我的代码会比elifs慢,我只是好奇,如果我做的事情效率低下,或者有更好的方法去做。 – Jamie 2010-02-08 21:20:35