在python中评估Sympy布尔表达式

时间:2017-02-03 12:11:48

标签: python sympy sat

我正在使用Python和Sympy。

我有以下内容:

x,y,z = Symbols('x,y,z')
doc = {x : False, y : True, z: True}
rule = Or(x, And(y,z))

我在Sympy中寻找一个会在True上返回rule.eval(doc)的函数吗?

编辑: 目前我正在使用rule.subsrule.xreplace两者都在缓慢执行,每次通话约0.0003秒。这使得它不切实际。

2 个答案:

答案 0 :(得分:1)

使用最少编码获得更好性能的方法是使用lambdify

X = tuple(doc.iterkeys())
f = lambdify(X, rule)

这次IPython给了我:

V = tuple(doc.itervalues())
%timeit f(*V)
The slowest run took 7.56 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 209 ns per loop

我不确定警告可能会对结论产生多大影响,但有明显的改善。在我使用原始代码的同一台计算机上:

%timeit rule.xreplace(doc)
10000 loops, best of 3: 126 µs per loop

潜艇甚至更慢。

答案 1 :(得分:0)

您可以使用直接评估,而不是使用潜艇吗?

>>> F = Lambda((x, y, z), Or(x, And(y, z)))
>>> F(0, 1, 1)
True

如果没有,你能创建一个玩具类,通过lambda形式允许潜艇吗?这不是一个类,但它提出了这个想法:

>>> def sub(f, d):
...     F = Lambda(d.keys(), f)
...     return F(*[d[k] for k in d.keys()])
>>> sub(Or(x,And(y,z)),{x:0,y:1,z:1})

该类将创建Lambda表单并使用subs方法返回已评估的Lambda表单。