为什么在Z3py中创建And / Or对象比预期花费更多时间?

时间:2015-12-17 02:03:52

标签: performance z3 z3py

我正在使用Z3py,我必须创建数千个And()和Or()对象以提供给Z3 Solver。似乎大部分时间都是创建这些对象(将它们添加到求解器并解决它们要快得多)。作为极端情况,我试过这个:

assertion = True
for i in range(10000):
    assertion = Or(assertion, True)

执行大约需要0.8秒(对于And()),这对于生成或断言对象来说似乎相当高。

Z3在创建And / Or对象时是否执行任何预处理,或者这种行为是否意外?我在Macbook Pro(2.4 GHz Intel i5,8 Gb RAM)上使用Z3py运行Z3。

1 个答案:

答案 0 :(得分:1)

功能

   def And(..):
       ...
   def Or(..):
       ...

在文件z3.py中对计算类型的参数执行许多检查。 它们还包括一些调试断言。您可以通过设置内置参数或使用-O标志调用python来禁用python中的调试断言。

最终,这些函数调用Z3_mk_and和Z3_mk_or函数。您可以 也直接从python调用这些并绕过额外的检查和强制。例如,您可以按以下行定义内容 实现绕过几个健全性检查的功能,所以如果你的 代码有错误,错误消息不会提供信息。

  def myAnd(es):       
      if es = []:
         return BoolVal(True, get_ctx())    
      num = len(es)
      ctx = es[0].ctx()
      _es = (Ast * num)()
      for I in range(num):
          _es[I] = es[I].as_ast()
      return BoolRef(Z3_mk_and(ctx.ref(), num, _es), ctx)