如何从pycallgraph跟踪中获取有用的信息?

时间:2015-06-28 20:26:12

标签: python gephi pycallgraph

在关于跟踪python执行的question中,我建议使用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()

此代码来自我的另一个question我在matplotlib中询问过层次结构,我得到以下答案:

  

如果你真的很想知道自动创作是如何完成的 - 那就是全部   开源。您可以看到对plot()的调用创建了一个Axes实例   通过在这里的代码中调用gca()。这反过来调用gcf(),这   寻找一个图形管理器(这是实际维护的   州)。如果存在,则返回它管理的数字,否则   它使用plt.figure()创建一个新的。再一次,这个过程要一些   学位继承自matlab,初始调用通常是数字   在任何策划操作之前。

首先,我尝试使用graphviz选项进行pycallgraph,但它给了我以下错误:

$ 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中打开它时,我得到了巨大的图形(节点:1062,边缘: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."

我用(graphviz)运行它:

pycallgraph graphviz -- hello_world.py

输出(从生成的png文件中读取)是:

__main__ ---> <module>
  1. 我可以使用哪种工具来获得与我提到的相似的答案?换句话说,我怎么知道这是调用函数的顺序:plot() - &gt; gca() - &gt; GCF()?
  2. 什么是pycallgraph实际跟踪?
  3. 为什么hello world示例正在使用graphviz选项,但更复杂的示例仅适用于gephi选项?
  4. 如何保存生成pycallgraph并传递给graphviz的DOT格式?

0 个答案:

没有答案