为什么在 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)
我正在使用 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)