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

Why does creating And/Or objects in Z3py take more time than expected?

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

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

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

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

函数

   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)