Python 在Z3Py中加速公式构建

Python 在Z3Py中加速公式构建,python,performance,profiling,z3,sat,Python,Performance,Profiling,Z3,Sat,我使用Z3Py来构建大型公式(~1500Bool变量,~90k断言),目前我正在使用Solver.add来添加断言,这些断言大多很小(例如,对两个变量的影响) 我的代码看起来像这样,大约有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秒(使用\

我使用Z3Py来构建大型公式(~1500
Bool
变量,~90k断言),目前我正在使用
Solver.add
来添加断言,这些断言大多很小(例如,对两个变量的影响)

我的代码看起来像这样,大约有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秒(使用
\uuuu debug\uuuu==False
),而找到解决方案只需要约8秒

分析表明,很多时间都花在
Z3\u sort\u to ast
z3code.Elementaries.Check
(由前者调用)和其他方法上,这些方法看起来至少可以内联,如果不是以某种方式消除的话

如何优化Z3
解算器的创建?也许有一个更低级的内部接口可以加快速度?

我看到3个选项:

  • 使用SMT-LIB接口
  • 跳过Z3的高级API
  • 直接使用C API重写代码
如果与Z3的交互最小(求解并获取模型),SMT-LIB可能是最佳选择

如果用C重写python代码相当复杂,请尝试一下pySMT。我们与Z3集成的方式跳过了高级API,直接调用python级别公开的底层C函数。pySMT本身会产生开销,但通常会付出代价。您可以查看[1]了解我们如何做的一些想法

[1] 我看到了3个选项:

  • 使用SMT-LIB接口
  • 跳过Z3的高级API
  • 直接使用C API重写代码
如果与Z3的交互最小(求解并获取模型),SMT-LIB可能是最佳选择

如果用C重写python代码相当复杂,请尝试一下pySMT。我们与Z3集成的方式跳过了高级API,直接调用python级别公开的底层C函数。pySMT本身会产生开销,但通常会付出代价。您可以查看[1]了解我们如何做的一些想法


[1]

Python API没有针对速度进行优化,很可能在不必要的深度嵌套函数和断言/异常/类型检查中浪费大量时间。为了在构建过程中获得最佳性能,最好直接使用C API。Python API没有针对速度进行优化,很可能会在不必要的深度嵌套函数和断言/异常/类型检查中浪费大量时间。为了在构建期间获得最佳性能,最好直接使用C API。