【发布时间】:2010-02-08 16:00:31
【问题描述】:
我最近了解到 python 没有 switch/case 语句。我一直在阅读有关使用字典的信息,例如:
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)()
我试过用 if/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,'}'
检查 var sep_ang 的大约 1500 个值大约需要 5 分钟。好像我不想使用 setAttribute() 根据 sep_ang 的值更改我的 xml 文件中的值,我使用这个简单的 if else:
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 行代码和 4 行代码吗?你是在问为什么 14 行代码可能比 4 行代码慢?
-
当然我知道运行 14 行代码比运行 4 行代码需要更长的时间(这就是为什么我说它运行得更慢可能是显而易见且不可避免的)。我不认为仅仅因为某些代码比另一个代码多 10 行,它就应该慢 10 倍。我认为我的代码大大减慢了它的速度是每个 elif 语句都必须根据我的 ang_sep 变量的 1500 个左右的值进行检查。我知道我的代码使用 elifs 会变慢,我只是好奇我做事是否效率低下,是否有更好的方法来做到这一点。
标签: python dictionary switch-statement