如何防止pycallgraph进入标准库函数?

and*_*dyn 15 python profiling

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

如何让pycallgraph只在我的代码中显示调用?目前凌乱的结果是没用的.

编辑:我正在使用0.5.1,可通过easy_install获得.运行pycallgraph ./cursesclient.py会输出:一个凌乱的调用图.如您所见,pycallgraph显示了模块json,re,编码,套接字和线程的内部结构.Re和编码永远不会直接在我的代码中调用,而是分别通过json和socket调用.

小智 12

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
Run Code Online (Sandbox Code Playgroud)

pycallgraph跟踪开始是

pycallgraph.start_trace(filter_func=filtercalls)
Run Code Online (Sandbox Code Playgroud)

这样,您在filtercalls中提供的任何模块,类或函数都将被删除.请注意,标准库中很多时候只提供模块名称是不够的.因此,在mod_ignore中包含numpy仍然会导致包含numpy.core

  • 应该是正确的答案,因为它做了OP所要求的,例如,如果不使用"正确的"答案消除自己的Thread实例,甚至可能无法限制线程 (3认同)

Nat*_*ght 5

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')
Run Code Online (Sandbox Code Playgroud)

这就是你要追求的吗?

资源

  • 打字几乎导致我想要的东西,但是包装所有标准库调用以避免绘图和分析它们是很繁琐的; 尤其是如此,因为根据pycallgraph的命令行帮助,它不应该被default.However图来描绘,因为它已经快一个月了,我会接受在没有更好的替代品的答案. (3认同)