Python 在Z3Py中加速公式构建
我使用Z3Py来构建大型公式(~1500Python 在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秒(使用\
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。