我有一個問題,我有一堆需要很長時間才能執行的函數,每個函數都返回一個布爾值True/False。我將一個巨大的布爾表達式應用於所有函數以獲得總體True/False分數。目前我的代碼不是基於函數的,所以所有的函數都被執行,然後應用大的布爾表達式。我已經知道讓它們的功能可以允許短循環的子表達式來防止某些函數調用。我現在需要的是一種重新排列表達式的方法,使得我有最少的通話次數。如何重新排序布爾邏輯以更快地短路?
考慮下面的代碼(可怕的代碼示例,但你應該明白我的意思):
def q():
print "q"
return False
def r():
print "r"
return False
def s():
print "s"
return False
def a():
print "a"
return False
def b():
print "b"
return False
def c():
print "c"
return False
def d():
print "d"
return False
def i():
print "i"
return False
def j():
print "j"
return False
(q() or r() or s()) and (a() and b() and c() and (i() or j()))
在這種情況下,你見問答[R印出來。全都是假的,所以它短路。在這種情況下,應該首先評估b或c,因爲如果其中任何一個爲False,則整個表達式爲False。假設最後的表達式是由用戶生成的,所以我無法對最佳可能順序進行硬編碼。我在想,我錯過了一個非常簡單的算法。其他
兩件事情:
1)如果我允許其他邏輯,例如「不」? 2.)我可以根據運行需要多長時間來分配每個函數,然後計算它嗎?