Какой самый простой способ сгенерировать потоковый график управления для метода на Python?

#python #methods #graph

#python #методы #График

Вопрос:

Я пишу программу, которая пытается сравнить два метода. Я хотел бы сгенерировать графики потока управления (CFG) для всех сопоставленных методов и использовать либо топологическую сортировку для сравнения двух графиков.

Комментарии:

1. bytecode.readthedocs.io/en/latest/cfg.html

Ответ №1:

Есть пакет Python под названием staticfg , который выполняет именно это — генерацию графиков потока управления из фрагмента кода Python.

Например, поместив первый фрагмент Python быстрой сортировки из кода Rosseta в qsort.py , следующий код генерирует его график потока управления.

 from staticfg import CFGBuilder

cfg = CFGBuilder().build_from_file('quick sort', 'qsort.py')
cfg.build_visual('qsort', 'png')
  

быстрая сортировка

Обратите внимание, что, похоже, он не понимает более продвинутый поток управления, такой как comprehensions.

Ответ №2:

RPython, набор инструментов перевода, лежащий в основе PyPy, предлагает способ захвата потокового графика pypy/rpython/flowspace каталоге проекта PyPy) для вывода типа.

В большинстве случаев это работает довольно хорошо, но генераторы не поддерживаются. Результат будет в форме SSA, которая может быть хорошей или плохой, в зависимости от того, что вы хотите.

Комментарии:

1. Может быть, это: doc.pypy.org/en/latest/objspace.html#the-flow-model и doc.pypy.org/en/release-2.0-beta2/…

Ответ №3:

Я обнаружил, что 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:
введите описание изображения здесь

Изображение из PY2CFG: введите описание изображения здесь

Ответ №4:

http://pycallgraph.slowchop.com / выглядит так, как вам нужно.

В модуле Python trace также есть опция --trackcalls , которая может быть точкой входа для механизма отслеживания вызовов в stdlib.

Комментарии:

1. Вопрос касается графика потока управления , а не графика вызовов .

2. Принято. Является ли граф вызовов подмножеством CFG? Википедия умалчивает об отношениях между ними. Я думал, что вы можете создать CG из отфильтрованного CFG.

3. @johntex, по поводу вопроса о сравнении двух методов. Что вы думаете об использовании хэшей AST для этого?