在Python中生成方法控制流图的最简便方法是什么?
我正在写一个程序,目的是比较两种方法。我想为所有匹配的方法生成控制流图(CFG),然后使用拓扑排序来比较这两个图。
4 个回答
2
我发现py2cfg在控制流图(CFG)的表现上比staticfg要好。
我们来看这个Python函数:
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
fib_gen = fib()
for _ in range(10):
next(fib_gen)
7
RPython 是一个工具,背后支持着 PyPy。它提供了一种方法,可以获取 流程图(在 pypy/rpython/flowspace
这个目录下)用于 类型推断。
在大多数情况下,这个方法效果很好,但它不支持生成器。最终得到的结果是 SSA 形式,这可能对你来说是好事,也可能是坏事,这要看你具体想要什么。
9
有一个叫做 staticfg
的Python库,它的功能正是从一段Python代码中生成控制流图。
比如,把来自 Rosseta Code 的第一个快速排序的Python代码放到 qsort.py
文件里,下面的代码就能生成它的控制流图。
from staticfg import CFGBuilder
cfg = CFGBuilder().build_from_file('quick sort', 'qsort.py')
cfg.build_visual('qsort', 'png')
需要注意的是,它似乎不太理解更复杂的控制流,比如列表推导式。