我目前有一种令人讨厌的代码块,我正在为一个模拟螃蟹成长的程序编写代码(令人兴奋的东西……)。这个程序后来被更大的模拟所吸收,所以代码的速度很重要。我最慢的代码块之一包含了这个讨厌的分支逻辑。我希望有人能想出一种更有效的方法.
就上下文而言,这段代码基本上是在说:“我是在再生一只爪子吗?如果是哪一只。如果左/右爪子正在再生,那么它是占主导地位的还是不占主导地位的一只手?有鉴于此,应用这个数字xyz。”
if left_or_right_growing == 'left':
if crab.rightclawCrusher == True:
crab.rightclaw_size = new_crushersize
if crab.moltnumber_for_claw_removal_left < crab.numberofmolts: #so it doesn't overwrite budding claw growth
crab.leftclaw_size = max(new_pincersize * crab.proportion_of_new_claw_thats_grownback()+adj, crab.leftclaw_size)
elif crab.rightclawCrusher == False:
crab.rightclaw_size = new_pincersize + adj
if crab.moltnumber_for_claw_removal_left < crab.numberofmolts: #so it doesn't overwrite budding claw growth
crab.leftclaw_size = max(new_crushersize * crab.proportion_of_new_claw_thats_grownback(), crab.leftclaw_size)
elif left_or_right_growing == 'right':
if crab.rightclawCrusher == True:
crab.leftclaw_size = new_pincersize + adj
if crab.moltnumber_for_claw_removal_right < crab.numberofmolts: #so it doesn't overwrite budding claw growth
crab.rightclaw_size = max(new_crushersize * crab.proportion_of_new_claw_thats_grownback(), crab.rightclaw_size)
elif crab.rightclawCrusher == False:
crab.leftclaw_size = new_crushersize
if crab.moltnumber_for_claw_removal_right < crab.numberofmolts: #so it doesn't overwrite budding claw growth
crab.rightclaw_size = max(new_pincersize * crab.proportion_of_new_claw_thats_grownback() +adj, crab.rightclaw_size)
elif left_or_right_growing == 'both':
pro_left, pro_right = crab.proportion_of_new_claw_thats_grownback()
if pro_left > 1. or pro_right > 1.:
print('ERROR IN TRANFORM: pro_left: ' + str(pro_left) +' pro_right: ' + str(pro_right))
if crab.rightclawCrusher == True:
if crab.moltnumber_for_claw_removal_left < crab.numberofmolts: #so it doesn't overwrite budding claw growth
crab.leftclaw_size = max(new_pincersize * pro_left+ adj, crab.leftclaw_size)
if crab.moltnumber_for_claw_removal_right < crab.numberofmolts:
crab.rightclaw_size = max(new_crushersize * pro_right, crab.rightclaw_size)
else:
if crab.moltnumber_for_claw_removal_right < crab.numberofmolts: #so it doesn't overwrite budding claw growth
crab.rightclaw_size = max(new_pincersize * pro_right+ adj, crab.rightclaw_size)
if crab.moltnumber_for_claw_removal_left < crab.numberofmolts:
crab.leftclaw_size = max(new_crushersize * pro_left, crab.leftclaw_size)发布于 2017-04-18 16:54:50
根据前面的人所说的,您可以为在三个条件之后出现的所有嵌套的if语句创建一个函数。然后你会把它们放在字典里,然后按这样的方式调用它们。下面是一个演示此方法的示例:
def fizz(x, y):
return x*y
def foo(k, v):
return k - v
def buzz(a, b):
return a + b然后你就这样编了一本字典:
opts = {'left':fizz, 'right':foo, 'both':buzz}那么您的代码将如下所示:
if left_or_right_growing == 'left':
opts['left'](1,2)
## output is 2
elif left_or_right_growing == 'right':
opts['right'](3,4)
## output is -1
elif left_or_right_growing == 'both':
opts['both'](5,6)
## output is 11为了回答你向另一个人提出的问题,是的,这个方法最终应该比一堆嵌套的if语句更快。对代码进行基准测试,看看会发生什么。
编辑:使用我的方法的一些示例基准测试:
real 0m0.020s
user 0m0.010s
sys 0m0.007s然后,当我使用您的方法并将函数替换为它自己的if循环时:
real 0m0.037s
user 0m0.012s
sys 0m0.009s下面是用于测试函数方法的脚本:
import sys
def fizz(crab, x, y):
if crab == 2:
print 'Hello'
else:
return x*y
def foo(crab, k, v):
if crab == 2:
print 'Hello'
else:
return k - v
def buzz(crab, a, b):
if crab == 2:
print 'Hello'
else:
return a + b
opts = {'left':fizz, 'right':foo, 'both':buzz}
def main():
left_or_right_growing = sys.argv[1]
crab = int(sys.argv[2])
if left_or_right_growing == 'left':
opts['left'](crab,1,2)
elif left_or_right_growing == 'right':
opts['right'](crab,3,4)
elif left_or_right_growing == 'both':
opts['both'](crab,5,6)
if __name__ == '__main__':
main()为了测试if循环,我只需用一个简单的if循环替换函数。正如您所看到的,即使对于这样一个简单的任务,函数方法也更快。
发布于 2017-04-18 16:29:47
您可以将这段代码放入一个函数中,以使其看起来更干净:
if crab.rightclawCrusher == True:
crab.rightclaw_size = new_crushersize
if crab.moltnumber_for_claw_removal_left < crab.numberofmolts: #so it doesn't overwrite budding claw growth
crab.leftclaw_size = max(new_pincersize * crab.proportion_of_new_claw_thats_grownback()+adj, crab.leftclaw_size)
elif crab.rightclawCrusher == False:
crab.rightclaw_size = new_pincersize + adj
if crab.moltnumber_for_claw_removal_left < crab.numberofmolts: #so it doesn't overwrite budding claw growth
crab.leftclaw_size = max(new_crushersize * crab.proportion_of_new_claw_thats_grownback(), crab.leftclaw_size)https://stackoverflow.com/questions/43477525
复制相似问题