将 z3 符号表达式存储到字典键中的有效方法
Efficient method to store z3 symbolic expression into the key of a dictionary
我正在使用 Z3Py
开发一些工具,在我的代码中,我维护多个 dictionaries
来跟踪一些信息。
请注意,有时我需要使用 z3
表达式作为某些字典的键,并且由于 z3
表达式不可哈希(我说的对吗?),我现在正在做什么是:
- 使用
Python str
函数将 z3
表达式转换为字符串。
- 将
string
表示存储为字典的键。
然而,一些分析和观察表明,从 z3
表达式到 string
的转换需要相当多的时间,这已成为我代码的瓶颈。
所以这是我的问题,使用 z3
表达式作为字典中的键的最有效方法是什么?或者有什么解决方法吗?
表达式应该是可哈希的。表达式覆盖 hash 和 eq 方法。
访客示例 https://github.com/Z3Prover/z3/blob/master/examples/python/visitor.py 使用字典。
作为旁注,我怀疑这在常见情况下是否相关:您可以依赖的另一个 属性 是表达式具有唯一的整数标识符。方法 "get_id()" returns 标识符。这提供了另一种索引表达式的方法。表达式的标识符是从 0 开始的数字。最大标识符永远不会超过创建的表达式的数量。如果表达式被垃圾收集,则标识符被回收。因此,如果您使用此功能,当然要确保将表达式固定在堆中。
我正在使用 Z3Py
开发一些工具,在我的代码中,我维护多个 dictionaries
来跟踪一些信息。
请注意,有时我需要使用 z3
表达式作为某些字典的键,并且由于 z3
表达式不可哈希(我说的对吗?),我现在正在做什么是:
- 使用
Python str
函数将z3
表达式转换为字符串。 - 将
string
表示存储为字典的键。
然而,一些分析和观察表明,从 z3
表达式到 string
的转换需要相当多的时间,这已成为我代码的瓶颈。
所以这是我的问题,使用 z3
表达式作为字典中的键的最有效方法是什么?或者有什么解决方法吗?
表达式应该是可哈希的。表达式覆盖 hash 和 eq 方法。 访客示例 https://github.com/Z3Prover/z3/blob/master/examples/python/visitor.py 使用字典。
作为旁注,我怀疑这在常见情况下是否相关:您可以依赖的另一个 属性 是表达式具有唯一的整数标识符。方法 "get_id()" returns 标识符。这提供了另一种索引表达式的方法。表达式的标识符是从 0 开始的数字。最大标识符永远不会超过创建的表达式的数量。如果表达式被垃圾收集,则标识符被回收。因此,如果您使用此功能,当然要确保将表达式固定在堆中。