在Python中生成方法控制流图的最简便方法是什么?

21 投票
4 回答
22882 浏览
提问于 2025-04-16 18:46

我正在写一个程序,目的是比较两种方法。我想为所有匹配的方法生成控制流图(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)

来自StaticCFG的图像: enter image description here

来自PY2CFG的图像: enter image description here

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')

quick sort

需要注意的是,它似乎不太理解更复杂的控制流,比如列表推导式。

撰写回答