#python #methods #graph
#python #методы #График
Вопрос:
Я пишу программу, которая пытается сравнить два метода. Я хотел бы сгенерировать графики потока управления (CFG) для всех сопоставленных методов и использовать либо топологическую сортировку для сравнения двух графиков.
Комментарии:
Ответ №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)
Ответ №4:
http://pycallgraph.slowchop.com / выглядит так, как вам нужно.
В модуле Python trace также есть опция --trackcalls
, которая может быть точкой входа для механизма отслеживания вызовов в stdlib.
Комментарии:
1. Вопрос касается графика потока управления , а не графика вызовов .
2. Принято. Является ли граф вызовов подмножеством CFG? Википедия умалчивает об отношениях между ними. Я думал, что вы можете создать CG из отфильтрованного CFG.
3. @johntex, по поводу вопроса о сравнении двух методов. Что вы думаете об использовании хэшей AST для этого?