小编Jef*_*ffb的帖子

在Python中将布尔表达式评估为字符串的更快方法

我现在已经在这个项目上工作了几个月。该项目的最终目标是评估类似于功能测试的整个数字逻辑电路。只是给出问题的范围。我在此处创建的主题处理的是我在分析布尔表达式时遇到的问题。对于数字电路内的任何门,它具有以全局输入表示的输出表达式。例如:((A&B)|(C&D)^E)。然后,我想用这个表达式来计算所有可能的结果并确定每个输入对结果有多大影响。

我发现最快的方法是通过建立一个真值表作为矩阵并查看某些行(因为它的题外话就不再详述该算法),一旦唯一输入的数量超过26,就会出现问题。 -27(大约在此范围内),内存使用量远远超过16GB(我的计算机具有的最大容量)。您可能会说“购买更多RAM”,但是随着输入每增加1,内存使用量就会增加一倍。我分析的某些表达式远远超过200种独特的输入...

我现在使用的方法使用compile方法将表达式作为字符串。然后,我使用从compile方法中找到的所有输入创建一个数组。然后,我会从可能值的样本中随机选择一个逐行生成的“真”和“假”列表(这样,如果样本大小与范围相同,则它等同于真值表中的行,并且当事情太长而无法计算时,将允许我限制样本数量)。然后将这些值与输入名称压缩在一起,并用于评估表达式。这将给出初始结果,此后,我在随机布尔列表中逐列浏览并翻转布尔值,然后再次用输入压缩它,然后再次评估它以确定结果是否更改。

所以我的问题是:有没有更快的方法?我已经包括执行工作的代码。我尝试过查找和替换正则表达式,但是它总是比较慢(从我所见)。考虑到内部for循环将运行N次,其中N是唯一输入的数量。如果N > 15,则外部for循环I限制为运行2 ^ 15。因此这将导致eval被执行Min(2^N, 2^15) * (1 + N)...

作为更新,以澄清我的确切要求(对您的困惑,抱歉)。计算我需要的算法/逻辑不是问题。我正在寻找python内置'eval'的替代方法,它将更快地执行相同的操作。(采用布尔表达式格式的字符串,将字符串中的变量替换为字典中的值,然后求值该字符串)。

#value is expression as string
comp = compile(value.strip(), '-', 'eval')
inputs = comp.co_names
control = [0]*len(inputs)

#Sequences of random boolean values to be used
random_list = gen_rand_bits(len(inputs))


for row in random_list:
    valuedict = dict(zip(inputs, row))
    answer = eval(comp, valuedict)

    for column in range(len(row)):
        row[column] = ~row[column]

        newvaluedict = dict(zip(inputs, row))
        newanswer = eval(comp, newvaluedict)

        row[column] = …
Run Code Online (Sandbox Code Playgroud)

python string expression boolean eval

2
推荐指数
1
解决办法
2145
查看次数

标签 统计

boolean ×1

eval ×1

expression ×1

python ×1

string ×1