乐趣区

关于程序员:神库可视化Python程序调用流程

明天咱们来分享一个 Python 畛域的神级第三方库 — pycallgraph,通过该库并联合 graphviz 工具,就能够十分不便的实现 Python 应用程序调用流程的可视化工作

咱们先来看下效果图

怎么样,很是惊艳吧~

上面咱们就来一起实现这个可视化过程

装置 graphviz 工具

生成图片的过程,是依赖工具 graphviz 的,咱们先进行下载安装

下载地址

http://www.graphviz.org/downl…

具体对于 graphviz 工具,大家应该也相熟了,咱们以前通过该工具进行过决策树的可视化工作,具体能够看这里

数据分析入门系列教程 - 决策树实战

下面的链接一具体的装置配置过程,这里就不再赘述了

实战

接下来咱们还须要装置两个 Python 依赖库

pip install pycallgraph

上面咱们先写一个根底的代码

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput


class Banana:
    def eat(self):
        pass


class 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 range(10):
            person.add_banana(Banana())
        person.eat_bananas()


if __name__ == '__main__':
    main()

代码比较简单,定义了两个简略类,次要 pycallgraph 的外围代码在 main 函数中,在 with 代码块下,把咱们定义的代码执行一遍即可

运行下面的代码,会在当前目录下生成 basic.png 图片文件

从生成的图片能够十分清晰的看出整个代码的运行过程,从 main 代码块到各个类的初始化,能够说高深莫测

咱们再来一个简单一点的例子

import re

from pycallgraph import PyCallGraph
from pycallgraph import Config
from pycallgraph.output import GraphvizOutput


def main():
    graphviz = GraphvizOutput()
    graphviz.output_file = 'regexp.png'
    config = Config(include_stdlib=True)

    with PyCallGraph(output=graphviz, config=config):
        reo = compile()
        match(reo)


def compile():
    return re.compile('^[abetors]*$')


def match(reo):
    [reo.match(a) for a in words()]


def words():
    return [
        'abbreviation',
        'abbreviations',
        'abettor',
        'abettors',
        'abilities',
        'ability',
        'abrasion',
        'abrasions',
        'abrasive',
        'abrasives',
    ]

if __name__ == '__main__':
    main()

代码同样不负责,不过在编译器外部是调用了 re 正则的,咱们来看看最终生成的图片

能够看到整个代码过程简单了很多,因为外部调用了很多正则外部函数等,然而整体还是十分清晰的

能够说这个神级第三方库,相对是泛滥 Python 爱好者,尤其是刚刚入门 Python 畛域的敌人的福音,当咱们遇到某些不相熟的较为简单的代码块时,无妨应用该库来尝试一下可视化,看看能不能从中暴发灵感呢~

好了,这就是明天分享的全部内容,喜爱就点个赞吧~

本文由 mdnice 多平台公布

退出移动版