【问题标题】:How to prevent pycallgraph from entering standard library functions?如何防止pycallgraph进入标准库函数?
【发布时间】:2012-10-20 18:44:16
【问题描述】:

我在命令行中使用pycallgraph 来分析和绘制一个相对简单程序的调用图。但是,即使我不使用 -s 命令行选项,生成的图像也包括标准库(线程、json、套接字)的内部结构。使用 -e 选项排除这些模块无效,使用 -i 会导致空调用图。我也试过 cProfile,但它只绘制主线程。

如何使 pycallgraph 仅在我的代码中显示调用?目前乱七八糟的结果是没用的。

编辑:我使用的是 0.5.1,可通过 easy_install 获得。运行 pycallgraph ./cursesclient.py 输出:。如您所见,pycallgraph 显示模块 json、re、编码、套接字和线程的内部结构。在我的代码中甚至从未直接调用 re 和 encodings,而是分别通过 json 和 socket。

【问题讨论】:

  • 无论如何,谢谢你指点我 pycallgraph。
  • 你用的是什么版本?在 0.5.1 中,我可以只使用调用“pycallgraph mycode.py”的函数制作图形,但选项“-s”会忽略一些模块,如“functools”

标签: python profiling


【解决方案1】:

Pycallgraph 提供过滤功能来过滤掉您想从调用图中排除的任何模块、类或函数。应该在开始跟踪之前定义以下函数并传递给 pycallgraph

例子

def filtercalls(call_stack, modul, clas, func, full):
    mod_ignore = ['shutil','scipy.optimize','re','os','sys','json']
    func_ignore = ['CustomFunctionName','pdbcall']
    clas_ignore = ['pdb']
    return modul not in mod_ignore and func not in func_ignore and clas not in clas_ignore

pycallgraph 跟踪开始是

pycallgraph.start_trace(filter_func=filtercalls)

这样,您在过滤器调用中提供的任何模块、类或函数都将被删除。请注意,在标准库中仅仅提供模块名称是不够的。因此,在 mod_ignore 中包含 numpy 仍然会导致 numpy.core 被包含

【讨论】:

  • 应该可以说是正确的答案,因为它可以满足 OP 的要求,例如,如果不消除您自己的 Thread 实例以及使用“正确”答案,甚至可能无法限制线程
【解决方案2】:

pycallgraph 有一个未记录的 stop_trace() 方法,您可以使用它来排除代码段。类似的东西

import pycallgraph
import mycode
import stuff_i_dont_want_to_see

pycallgraph.start_trace()
#Initializations

pycallgraph.stop_trace()
stuff_i_dont_want_to_see()
pycallgraph.start_trace()

mycode.things()
pycallgraph.make_dot_graph('cleaner_graph.png')

这就是你所追求的吗?

source

【讨论】:

  • 键入几乎可以得到我想要的结果,但是包装所有标准库调用以避免对它们进行图形和分析是很乏味的;尤其如此,因为根据 pycallgraph 的命令行帮助,默认情况下它不应该绘制它们。但是,由于已经快一个月了,在没有更好的选择的情况下,我会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
相关资源
最近更新 更多