簡體   English   中英

python-優化分支邏輯

[英]python - optimizing branching logic

目前,我正在為模擬螃蟹(令人興奮的東西.....)生長的程序編寫一種令人討厭的代碼塊。 該程序后來被更大的仿真所吸收,因此代碼的速度至關重要。 我最慢的代碼塊之一包含這種討厭的分支邏輯。 我希望有人能想出一種方法來提高效率。

對於上下文,這段代碼基本上是在說:“我正在再生一只爪嗎?如果是,那是哪只。如果左爪/右爪正在再生,那它是優勢手還是非優勢手?給定這個,應用這個數字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)

解決前面的人說的那樣,您可以為三個條件之后出現的所有嵌套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循環替換了函數。 如您所見,即使對於像這樣的簡單任務,function方法也更快。

您可以將此代碼塊放入函數中,以使其看起來更簡潔:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM