python - 如何重新排序 bool 逻辑以更快地短路?

标签 python boolean-logic

我遇到一个问题,我有一堆函数需要很长时间才能执行,并且每个函数都返回 bool 值 True/False。我将一个巨大的 bool 表达式应用于所有函数以获得总体的真/假分数。目前我的代码不是基于函数的,因此所有函数都会被执行,然后应用大 bool 表达式。我已经发现,使它们成为函数将允许子表达式短路以防止某些函数调用。我现在需要的是一种对表达式重新排序的方法,以便我的调用次数最少。

考虑以下代码(可怕的代码示例,但您应该明白):

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())) 

在这种情况下,您会看到打印了 q r s。全部都是假的,所以短路了。但在这种情况下,应该首先评估 b 或 c,因为如果其中任何一个为 False,则整个表达式为 False。假设最后的表达式是由用户生成的,这样我就无法对最佳可能的顺序进行硬编码。我想我缺少一个非常简单的算法。

另外两件事:

1.) 如果我允许其他逻辑(例如“不”)怎么办? 2.) 我可以根据每个函数运行所需的时间为它分配一个分数,然后计算它吗?

最佳答案

为了优化你的表达式,你需要知道两件事:每个函数的成本,以及它发生短路的概率。一旦你有了这个,你就可以计算每个子表达式以产生相同的项;尝试参数顺序的每个排列将显示哪种排列具有最低的成本。

def evaluate_or(argument_evaluation_list):
    total_cost = 0.0
    probability_of_reaching = 1.0
    for cost, probability_of_true in argument_evaluation_list:
        total_cost += probability_of_reaching * cost
        probability_of_reaching *= 1.0 - probability_of_true
    return total_cost, 1.0 - probability_of_reaching

def evaluate_and(argument_evaluation_list):
    total_cost = 0.0
    probability_of_reaching = 1.0
    for cost, probability_of_true in argument_evaluation_list:
        total_cost += probability_of_reaching * cost
        probability_of_reaching *= probability_of_true
    return total_cost, probability_of_reaching

def evaluate_not(argument_evaluation)
    cost, probability_of_true = argument_evaluation
    return cost, 1.0 - probability_of_true

关于python - 如何重新排序 bool 逻辑以更快地短路?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898584/

相关文章:

c - 在 C 中,我使用 bool 逻辑通过 while 循环转到程序的开头,但是在我告诉它们之后,我的变量没有重新初始化

c# - 我怎样才能最好地检查 A xor B 是否为空?

python - argparse:让相同的必需参数是位置或可选的

Python - collections.OrderedDict() 未正确排序字典

r - 为什么 TRUE == "TRUE"在 R 中是 TRUE?

c - if 语句似乎永远不会失败

language-agnostic - 如何使用这个图灵机?

python - 如何忽略列表中的高偏差

Python3 将数组从 (x,y,3) 减少到 (x,y,1) (RGB 到灰度)

python - 如何在html中显示python应用程序?