我正在使用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秒。这使得它不切实际。
答案 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表单。