我使用Z3Py构建大型公式(〜1500个Bool
变量,约90k个断言),而我目前正在使用Solver.add
来添加断言,这些断言大多很小(例如,对2个变量的影响)。
我的代码看起来像这样,大约有10个外部for
循环。循环嵌套深度从2到6不等。
s = Solver()
for i in range(A):
for j in range(B):
...
s.add(Implies(vars[i,j,...], vars[k,l,...]))
问题在于,构建求解器大约需要11秒钟(使用__debug__ == False
),而找到解决方案则只需要8秒钟。
分析表明,Z3_sort_to_ast
,z3code.Elementaries.Check
(由前者调用)和其他似乎至少可以内联的方法(如果不能以某种方式消除)花费了大量时间。 / p>
如何优化Z3 Solver
的创建?也许有一个更底层的内部接口可以加快速度?
答案 0 :(得分:2)
我看到3个选项:
如果与Z3的交互作用很小(解决并获得模型),则SMT-LIB可能是最佳选择。
如果要使用C语言重写python代码非常复杂,请尝试pySMT。我们与Z3集成的方式将跳过高级API,并直接调用在python级别公开的底层C函数。 pySMT本身会产生开销,但通常会得到回报。您可以在[1]中找到一些有关我们如何做的想法。
[1] https://github.com/pysmt/pysmt/blob/master/pysmt/solvers/z3.py#L853