加快Z3Py中的公式构建

时间:2019-04-27 21:31:52

标签: python performance profiling z3 sat

我使用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_astz3code.Elementaries.Check(由前者调用)和其他似乎至少可以内联的方法(如果不能以某种方式消除)花费了大量时间。 / p>

如何优化Z3 Solver的创建?也许有一个更底层的内部接口可以加快速度?

1 个答案:

答案 0 :(得分:2)

我看到3个选项:

  • 使用SMT-LIB界面
  • 跳过Z3的高级API
  • 直接使用C API重写代码

如果与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