在 Z3py 中创建公式花费太多时间
Creating formula taking too much time in Z3py
使用Z3py生成公式,但是生成公式耗时太长。正常吗?
在下面的代码中,我只是采用 M-1 个参数并创建一个相等的公式。我在 Implies 方面发现了类似的时间。
from z3 import *
import time
import sys
M = 32
N = 8
p = [ [Bool ("p_{}_{}".format(i,k)) for k in range(M)] for i in range(N)]
a = [ [Bool ("a_{}_{}".format(i,k)) for k in range(M)] for i in range(N)]
sorts = [BoolSort() for m in range(M)]
f = [Function ("f_{}".format(m), *sorts) for m in range(M)]
starttime = time.time()
B = True
for i in range(N):
for j in range(M):
s = []
for k in range(M):
if j == k:
continue
s.append(p[i][k])
B = And (a[i][j] == f[j](*s), B)
print "B", str(time.time() - starttime)
例如上面的代码:
59.5714960098 sec
更改代码并将公式推入列表使其变得更好。但仍然是 8 秒..!
....
A_list = []
s = []
for i in range(N):
for j in range(M):
del [:]
.....
l = And (a[i][j] == f_n[j](*s))
A_list.append(l)
A0 = And( A_list )
print "A0", str(time.time() - starttime)
8.89373087883 sec
我是 Z3py 的第一次用户 Api。有人可以解释为什么要花太多时间,这是常态吗?
有一个直接的解决方法,即 运行 python 禁用调试。这是一个可以从命令行使用的标志。
我现在还修复了 Z3 以避免时间开销。它将打印从未在断言语句中使用的表达式和格式字符串(因为 _z3_assert 不是宏,它使用典型的按值评估语义调用,因此会产生成本来评估被丢弃的参数)。
即使使用 Z3 的调试版本,第一个示例现在也不到一秒钟。
使用Z3py生成公式,但是生成公式耗时太长。正常吗? 在下面的代码中,我只是采用 M-1 个参数并创建一个相等的公式。我在 Implies 方面发现了类似的时间。
from z3 import *
import time
import sys
M = 32
N = 8
p = [ [Bool ("p_{}_{}".format(i,k)) for k in range(M)] for i in range(N)]
a = [ [Bool ("a_{}_{}".format(i,k)) for k in range(M)] for i in range(N)]
sorts = [BoolSort() for m in range(M)]
f = [Function ("f_{}".format(m), *sorts) for m in range(M)]
starttime = time.time()
B = True
for i in range(N):
for j in range(M):
s = []
for k in range(M):
if j == k:
continue
s.append(p[i][k])
B = And (a[i][j] == f[j](*s), B)
print "B", str(time.time() - starttime)
例如上面的代码:
59.5714960098 sec
更改代码并将公式推入列表使其变得更好。但仍然是 8 秒..!
....
A_list = []
s = []
for i in range(N):
for j in range(M):
del [:]
.....
l = And (a[i][j] == f_n[j](*s))
A_list.append(l)
A0 = And( A_list )
print "A0", str(time.time() - starttime)
8.89373087883 sec
我是 Z3py 的第一次用户 Api。有人可以解释为什么要花太多时间,这是常态吗?
有一个直接的解决方法,即 运行 python 禁用调试。这是一个可以从命令行使用的标志。 我现在还修复了 Z3 以避免时间开销。它将打印从未在断言语句中使用的表达式和格式字符串(因为 _z3_assert 不是宏,它使用典型的按值评估语义调用,因此会产生成本来评估被丢弃的参数)。 即使使用 Z3 的调试版本,第一个示例现在也不到一秒钟。