Filtering is sometimes needed when the output of Python Call Graph is overwhelming, or if you want to only measure a small portion of your program. The filtering guide below is based on the filter.py example.
Let’s demonstrate with a class that can eat a banana:
import time
class Banana:
def __init__(self):
pass
def eat(self):
self.secret_function()
self.chew()
self.swallow()
def secret_function(self):
time.sleep(0.2)
def chew(self):
pass
def swallow(self):
pass
The code to measure it without any configuration, apart from the output file:
#!/usr/bin/env python
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
from banana import Banana
graphviz = GraphvizOutput(output_file='filter_none.png')
with PyCallGraph(output=graphviz):
banana = Banana()
banana.eat()
The Graphviz output after running the measurement code:
Probably need to hide that secret_function. Create a GlobbingFilter which excludes secret_function along with pycallgraph so we don’t see the internals. Add that filter to the config option called trace_filter:
#!/usr/bin/env python
from pycallgraph import PyCallGraph
from pycallgraph import Config
from pycallgraph import GlobbingFilter
from pycallgraph.output import GraphvizOutput
from banana import Banana
config = Config()
config.trace_filter = GlobbingFilter(exclude=[
'pycallgraph.*',
'*.secret_function',
])
graphviz = GraphvizOutput(output_file='filter_exclude.png')
with PyCallGraph(output=graphviz, config=config):
banana = Banana()
banana.eat()
And the output:
You can also use “include” as well as “exclude” in the GlobbingFilter.
Let’s say you’re only interested in the first level of calls. You can specify this using config.max_depth:
#!/usr/bin/env python
from pycallgraph import PyCallGraph
from pycallgraph import Config
from pycallgraph.output import GraphvizOutput
from banana import Banana
config = Config(max_depth=1)
graphviz = GraphvizOutput(output_file='filter_max_depth.png')
with PyCallGraph(output=graphviz, config=config):
banana = Banana()
banana.eat()
And the output: