Как получить полезную информацию из трассировки pycallgraph?

В моем вопросе об отслеживании выполнения Python мне было рекомендовано использовать pycallgraph, поэтому я решил попробовать его в следующем коде:

#!/bin/env python

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 2, 100)

# The first call to plt.plot will automatically create
# the necessary figure and axes to achieve the desired plot.
plt.plot(x, x, label='linear')

# Subsequent calls to plt.plot re-use
# the current axes and each add another line.
plt.plot(x, x**2, label='quadratic')
plt.plot(x, x**3, label='cubic')

# Setting the title, legend, and axis labels also automatically
# use the current axes and set the title,
# create the legend, and label the axis respectively.
plt.xlabel('x label')
plt.ylabel('y label')

plt.title("Simple Plot")

plt.legend()

plt.show()

Этот код взят из моего другого вопроса, где я спрашивал об иерархии в matplotlib, и я получаю следующий ответ:

Если вы действительно хотите увидеть, как происходит автоматическое создание - все это с открытым исходным кодом. Вы можете увидеть, что вызов plot() создает экземпляр Axes путем вызова gca() в коде здесь. Это, в свою очередь, вызывает gcf(), которая ищет FigureManager (который фактически поддерживает состояние). Если он существует, он возвращает фигуру, которой управляет, в противном случае он создает новую, используя plt.figure(). Опять же, этот процесс в некоторой степени наследуется от matlab, где начальный вызов обычно вычисляется перед любой операцией построения.

Сначала я пытался использовать pycallgraph с параметром graphviz, но он выдает следующую ошибку:

$ pycallgraph graphviz -- matplotlib.py
libpath/shortest.c:324: triangulation failed
libpath/shortest.c:192: source point not in any triangle
Error: in routesplines, Pshortestpath failed
Segmentation fault
Traceback (most recent call last):
  File "/usr/local/bin/pycallgraph", line 26, in <module>
    exec(__file_content)
  File "/usr/local/lib/python2.7/dist-packages/pycallgraph/pycallgraph.py", line 38, in __exit__
    self.done()
  File "/usr/local/lib/python2.7/dist-packages/pycallgraph/pycallgraph.py", line 81, in done
    self.stop()
  File "/usr/local/lib/python2.7/dist-packages/pycallgraph/pycallgraph.py", line 90, in generate
    output.done()
  File "/usr/local/lib/python2.7/dist-packages/pycallgraph/output/graphviz.py", line 112, in done
    'code %(ret)i.' % locals())
pycallgraph.exceptions.PyCallGraphException: The command "dot -Tpng -opycallgraph.png /tmp/tmpObsZGK" failed with error code 35584.

Во-вторых, я попытался создать формат Gephi, и это сработало:

$ pycallgraph gephi -- matplotlib.py

Когда я открыл это в Gephi, я получил огромный график (Nodes: 1062, Edges: 1362), который был почти бесполезен, и я не вижу здесь ничего полезного. Итак, я попытался ограничить вывод:

$ pycallgraph --max-depth 5 gephi -- traceme.py

Это дает мне график с 254 узлами и 251 ребрами, который в принципе также был бесполезен, потому что я до сих пор не вижу здесь ничего полезного. Итак, я решил попробовать следующее:

egrep -i 'gcf|gca|plot' pycallgraph.gdf

Но это ничего мне не возвращает. Тогда я начал задаваться вопросом, что именно является отслеживанием pycallgraph, и я сделал этот привет мир:

#!/bin/env python
print "This line will be printed."

И я запустил его с (графвиз):

pycallgraph graphviz -- hello_world.py

Вывод (считанный из сгенерированного файла png) был:

__main__ ---> <module>
  1. Какой инструмент я могу использовать, чтобы получить аналогичный ответ, как я уже говорил? Другими словами, как я могу узнать, что это порядок вызова функций: plot() -> gca() -> gcf()?
  2. Что на самом деле отслеживает pycallgraph?
  3. Почему пример hello world работает с опцией graphviz, а более сложный пример работает только с опцией gephi?
  4. Как сохранить формат DOT, который генерирует pycallgraph и передает в graphviz?

0 ответов

Другие вопросы по тегам