首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python -优化分支逻辑

python -优化分支逻辑
EN

Stack Overflow用户
提问于 2017-04-18 16:26:50
回答 2查看 110关注 0票数 2

我目前有一种令人讨厌的代码块,我正在为一个模拟螃蟹成长的程序编写代码(令人兴奋的东西……)。这个程序后来被更大的模拟所吸收,所以代码的速度很重要。我最慢的代码块之一包含了这个讨厌的分支逻辑。我希望有人能想出一种更有效的方法.

就上下文而言,这段代码基本上是在说:“我是在再生一只爪子吗?如果是哪一只。如果左/右爪子正在再生,那么它是占主导地位的还是不占主导地位的一只手?有鉴于此,应用这个数字xyz。”

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-18 16:54:50

根据前面的人所说的,您可以为在三个条件之后出现的所有嵌套的if语句创建一个函数。然后你会把它们放在字典里,然后按这样的方式调用它们。下面是一个演示此方法的示例:

代码语言:javascript
复制
def fizz(x, y):
    return x*y

def foo(k, v):
    return k - v

def buzz(a, b):
    return a + b

然后你就这样编了一本字典:

代码语言:javascript
复制
opts = {'left':fizz, 'right':foo, 'both':buzz}

那么您的代码将如下所示:

代码语言:javascript
复制
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语句更快。对代码进行基准测试,看看会发生什么。

编辑:使用我的方法的一些示例基准测试:

代码语言:javascript
复制
real    0m0.020s
user    0m0.010s
sys     0m0.007s

然后,当我使用您的方法并将函数替换为它自己的if循环时:

代码语言:javascript
复制
real    0m0.037s
user    0m0.012s
sys     0m0.009s

下面是用于测试函数方法的脚本:

代码语言:javascript
复制
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循环替换函数。正如您所看到的,即使对于这样一个简单的任务,函数方法也更快。

票数 3
EN

Stack Overflow用户

发布于 2017-04-18 16:29:47

您可以将这段代码放入一个函数中,以使其看起来更干净:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43477525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档