python数据流图_Python中快速比较数据流图

背景

我想证明两个数据处理函数在功能上是等价的。为此,我为每个函数构建了一个抽象语法树,然后对控制流进行了模拟,以构建最终输出的数据流图。在

数据流图由(operation,operanda,operandb)的3元组表示,因此(a+b)*2可以表示为:('*',('+','a','b'),'2')

我的一些操作是可交换的,因此等效图中的数据流可能是:

^{pr2}$

问题

如何检查我的2个数据流图是否同构(即执行完全相同的操作)?在

我所做的一切

我的想法是通过检测交换运算符并将它们的操作数按排序顺序排列(例如,字典顺序,尽管我认为只要我保持一致,顺序并不重要),从而将每个数据流图转换为规范形式。然后,我可以比较重新排序的元组以获得严格的相等性。在

对于我的图,我认为这个算法应该足够了,即使它不会发现(a+b)+c和a+(b+c)之间的等价性。在

然而,我遇到了一个效率问题,即使是小图。在

例如,这段Python代码只需28个操作就可以构建一个简单的数据流图,但是Python需要8秒来比较元组(而较大的图形会变得更糟糕):

^{3}$

我想问题是Python递归地进行比较,因此反复比较相同的节点会浪费大量的时间。在

是否有一些python方法可以使元组比较更有效,或者有更好的算法来比较我的数据流图?在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值