我正在使用 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.subs
,rule.xreplace
两者都执行缓慢,每次调用大约 0.0003 秒。这使得它不切实际。
以最少的编码获得更好性能的一种方法是使用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
潜艇甚至更慢。
您可以使用直接评估而不是使用 subs 吗?
>>> F = Lambda((x, y, z), Or(x, And(y, z)))
>>> F(0, 1, 1)
True
如果没有,您能否创建一个允许通过 lambda 表单进行 subs 的玩具类?这不是一个类,但它给出了这个想法:
>>> 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 表单。