2

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

4

2 回答 2

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

潜艇甚至更慢。

于 2017-02-15T12:11:20.393 回答
0

您可以使用直接评估而不是使用 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 表单。

于 2017-09-29T13:18:54.657 回答