pycallgraph-一个可视化Python应用程序流程(调用图)的工具

欢迎!pycallgraph是一个Python模块,可为Python应用程序创建调用图可视化。

  特征

  • 支持Python 2.7+和Python 3.3+。

  • 使用各种工具(例如Graphviz和Gephi)对调用图进行静态可视化。

  • 从命令行执行pycallgraph或将其导入代码中。

  • 可自定义的颜色。您可以根据调用次数,所需时间,内存使用情况等以编程方式设置颜色。

  • 可以在视觉上将模块分组在一起。

  • 易于扩展以创建自己的输出格式。

快速开始

需要使用pycallgraph,您可以通过pip安装或者网盘下载pycallgraph的源代码

pip install pycallgraph

您可以使用命令行界面快速查看Python脚本,也可以使用pycallgraph模块获取更细粒度的设置。

以下示例将graphviz指定为输出程序,因此需要安装它。他们将生成一个名为pycallgraph.png的文件。

运行pycallgraph的命令行方法是:

$ pycallgraph graphviz -- ./mypythonscript.py

该API的简单用法是:

from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputwith PyCallGraph(output=GraphvizOutput()):    code_to_profile()

示例

示例一

#!/usr/bin/env python'''This example demonstrates a simple use of pycallgraph.'''from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputclass Banana:    def eat(self):        passclass Person:    def __init__(self):        self.no_bananas()    def no_bananas(self):        self.bananas = []    def add_banana(self, banana):        self.bananas.append(banana)    def eat_bananas(self):        [banana.eat() for banana in self.bananas]        self.no_bananas()def main():    graphviz = GraphvizOutput()    graphviz.output_file = 'basic.png'    with PyCallGraph(output=graphviz):        person = Person()        for a in xrange(10):            person.add_banana(Banana())        person.eat_bananas()if __name__ == '__main__':    main()

下面是从上面的代码生成的图像:

示例二

#!/usr/bin/env python'''Runs a regular expression over the first few hundred words in a dictionary tofind if any words start and end with the same letter, and having two of thesame letters in a row.'''import argparseimport refrom pycallgraph import PyCallGraphfrom pycallgraph import Configfrom pycallgraph.output import GraphvizOutputclass RegExp(object):    def main(self):        parser = argparse.ArgumentParser()        parser.add_argument('--grouped', action='store_true')        conf = parser.parse_args()        if conf.grouped:            self.run('regexp_grouped.png', Config(groups=True))        else:            self.run('regexp_ungrouped.png', Config(groups=False))    def run(self, output, config):        graphviz = GraphvizOutput()        graphviz.output_file = output        self.expression = r'^([^s]).*(.)\2.*\1$'        with PyCallGraph(config=config, output=graphviz):            self.precompiled()            self.onthefly()    def words(self):        a = 200        for word in open('/usr/share/dict/words'):            yield word.strip()            a -= 1            if not a:                return    def precompiled(self):        reo = re.compile(self.expression)        for word in self.words():            reo.match(word)    def onthefly(self):        for word in self.words():            re.match(self.expression, word)if __name__ == '__main__':    RegExp().main()

下面是从上面的代码生成的图像:

(0)

相关推荐