【51CTO.com快译】通常,人们会使用两种速度来衡量某种编程语言的优劣,即:开发速度和执行速度。对于Python而言,大家往往受益的是它能够快速地编写代码,而忽略了它是否能够快速地运行,并及时完成既定的任务。因此,在出现程序运行缓慢时,我们有必要从代码层面上,找出拖慢的位置和原因,并对其进行处理。

好消息是,Python提供了许多不同用途的软件库,可方便我们对应用代码进行分析,并找出导致缓慢运行的部分。它们中,有的是只带有标准库的单行工具,有的是可以从运行程序中收集到统计信息的复杂框架。下面,我将向您介绍其中五个可以在PyPI或Python标准库中轻松获得,且能够跨平台运行的软件库。

1.Time和Timeit

有时候,您可能只想分析两个代码段从前一个结束到下一个开始运行,是需要几秒钟还是几分钟。对于这样的需求,您可能只需要一个秒表就足够了。

Python标准库带有两个可用作秒表的功能函数。其中,Time模块具有perf_counter功能。它可以调用操作系统的高精度定时器,以按需获得时间戳。其基本原理是:我们可以在目标操作开始前,调用一次time.perf_counter,然后在操作完成时,再调用一次,以获得两次的时间差。显然,这是一种非常简便易行的时间获取方式。

而Timeit模块则是会对Python代码进行实质性的审查。它的timeit.timeit功能函数会截取一个代码段,通过运行多次(默认为1百万次),以获得执行该操作所需的平均时间。我们经常可以用它来确定在某个紧密的循环中,单一操作或函数的调用时长。例如,如果您想判定一个列表解析式(list comprehension)与一个常规列表结构,哪个在执行多次操作时会更快一些(列表解析式通常更快)。

当然,Time的不足之处在于它只是一个秒表,而Timeit的不足之处在于:其主要用例是各个行或代码块上的各个细微标准差(microbenchmarks)。也就是说,仅当这些代码被单独处理时,这种比较才会有意义。因此,这两种方法都不足以对整个程序进行分析。一旦出现数千行的代码,这两种方法都会耗费您大量的时间。

2.cProfile

Python标准库还带有一个整体程序分析器--cProfile。在程序运行时,cProfile会通过跟踪代码中的每个函数的调用,以生成一个包含了最常调用函数、以及平均调用时间的列表。

cProfile具有三大优势:

由于它被包含在标准库中,因此现有的Python安装包已经包含了cProfile。

它可以分析有关调用行为的许多不同统计信息。例如:它能够将函数调用自己的指令所花费的时间,与该函数所有的其他调用耗时区分开来。据此,您可以判定出到底是该函数本身运行缓慢,还是在其他调用时出现的缓慢。

可以实现限定条件的自定义。也就是说,您既可以对整个程序的运行进行采样,又可以仅在指定的函数运行时启用概要分析(toggle profiling)。通过缩小范围和去除分析时产生的“噪声”,您可以更好地关注该函数的功能与调用。

cProfile的不足之处有:

默认情况下,它会设置多个采集点,生成大量的统计信息。

根据其执行模型,它在捕获每个函数调用时,都会产生大量的流量。因此cProfile不适合通过实时数据的方式,对生产环境中的应用程序进行性能分析。也就是说,它更适合于针对开发过程中的性能分析。

3.Pyinstrument

与cProfile的工作方式类似,Pyinstrument能够通过跟踪目标程序,以报告的形式,反映出那些占用了大部分运行时间的代码。不过,与cProfile相比,Pyinstrument的优点主要体现在如下两个方面:

Pyinstrument不会去勾连(hook)函数调用的每个实例,而是会以毫秒为间隔,对程序的调用栈进行采样,因此它能够灵敏地检测出程序中最耗费运行时的部分。

Pyinstrument的报告要简洁得多。它能够通过突出显示程序中占用时间最多的函数,以便您能尽快地发现问题,并专注分析原因。

Pyinstrument同样具有cProfile的各种优点。您可以将它用作应用程序中的对象,来记录所选功能,而不是整个程序的行为。Pyinstrument提供包括HTML格式在内的多种输出形式。当然,您也可以按需查看各个调用的完整时间线。

此外,如下两个方面值得您的注意:

某些通过C编译的扩展程序(例如使用Cython创建的程序),会在通过命令行进行Pyinstrument调用时,可能无法正常工作。不过,如果您在程序本身使用了Pyinstrument,例如:通过使用Pyinstrument分析器的调用包装了main()函数,那么它们还是能够正常工作的。

Pyinstrument不能很好地处理在多个线程中运行的代码。此时,您可能需要考虑使用下面将要介绍到的Py-spy。

4.Py-spy

与Pyinstrument一样,Py-spy在工作原理上,也是定期采集程序调用栈的状态,而不是记录每一个调用。不过,与PyInstrument不同,Py-spy带有用Rust编写的核心组件(而Pyinstrument使用的是C扩展程序),运行的是带有分析程序的外进程(out-of-process),因此它可以安全地与生产环境中的代码协同使用。

Py-spy能够轻松地完成许多其他分析工具无法实现的任务,其中包括:分析多线程或带有子处理(subprocessed)机制的Python程序等。此外,Py-spy也可以分析那些使用符号进行过编译的C扩展程序。而对于使用了Cython编译的扩展程序,Py-spy需要使用对应生成的C文件,以便收集正确的跟踪信息。

我们可以使用如下两种基本方法,来利用Py-spy检查应用程序:

使用Py-spy的record命令,并在运行结束后会生成火焰图(flame graph)。

使用Py-spy的top命令,通过实时更新,交互式地显示Python应用程序的内部,并以与Unix的top工具相同的方式显示信息。而且那些单线程栈也可以通过命令行被显示出来。

不过,Py-spy的最大缺点之一是:它主要适用于从外部分析整个程序、或是某些组件,不适合对某个特定的功能函数进行采样。

5.Yappi

Yappi是Yet Another Python Profiler(“另一个Python分析工具”)的缩写。它在功能上,较上述讨论过的工具库只多不少。在默认情况下,PyCharm(译者注:一款为专业Python 开发人员准备的IDE)会已安装了Yappi,因此用户在IDE中已经具有了对于Yappi的内置访问权限。

要使用Yappi,您需要用指令来“修饰”目标代码,以便针对分析机制进行调用,启动,停止和生成报告。Yappi允许您根据测试的实际需求,在“经过时间(wall time)”或“CPU时间”之间进行选择。前者只是一个秒表;后者则可以通过系统原生API,记录下CPU在实际执行代码过程中的用时,以便调整I/O的暂停或线程的休眠。可见,CPU时间能够方便您更加精确地了解某些操作(例如:数字代码的执行)的实际用时。

通过Yappi提供的函数--yappi.get_thread_stats(),您可以记录任何一个线程活动,检索出对应的统计信息,并分别对其进行分析。您不但无需“修饰”线程代码,而且可以对统计数据进行过滤和细粒度的排序(类似于cProfile中的此类操作)。

此外,Yappi的独到之处在于,它可以分析greenlet和coroutine(协程)。作为一种分析并发代码的强大工具,它可以被广泛地用来分析异步metaphor。

原文标题:5 great libraries for profiling Python code,作者:Serdar Yegulalp

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

【编辑推荐】

【责任编辑:华轩 TEL:(010)68476606】

点赞 0

python代码解读软件_5种带你轻松分析Python代码的软件库相关推荐

  1. python直方图分箱_5种方法教你用Python玩转histogram直方图

    作者:xiaoyu 微信公众号:Python数据科学 直方图是一个可以快速展示数据概率分布的工具,直观易于理解,并深受数据爱好者的喜爱.大家平时可能见到最多就是matplotlib,seaborn 等 ...

  2. 学Python还是Java, 7张漫画带你全面分析

    TIOBE 2020 年 6 月份的编程语言排行榜已经出来了.这个号称江湖兵器谱排行榜,每个月都会出炉一次,前十名几乎没有变化.C语言已经蝉联了2个月的第一,而Java和Python依然是老二和老三, ...

  3. 视频教程-Python爬虫视频课程:中国女性胸部大小分析-Python

    Python爬虫视频课程:中国女性胸部大小分析 东北大学计算机专业硕士研究生,欧瑞科技创始人&CEO,曾任国内著名软件公司项目经理,畅销书作者,企业IT内训讲师,CSDN学院专家讲师,制作视频 ...

  4. python入门教程软件-程序员带你十天快速入门Python,玩转电脑软件开发(四)

    本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...

  5. python做电脑软件-程序员带你十天快速入门Python,玩转电脑软件开发(一)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  6. python最简单单例模式_5种Python单例模式的实现方式

    本文为大家分享了Python创建单例模式的5种常用方法,供大家参考,具体内容如下 所谓单例,是指一个类的实例从始至终只能被创建一次. 方法1: 如果想使得某个类从始至终最多只有一个实例,使用__new ...

  7. 想自学Python却不知该如何入门?这篇文章带你轻松入门Python

    以2019年的资料为蓝本,2018年的资料为补充,还参考了一些网上的教程,旨在更好地总结Python基础知识,力求简明扼要,以供实战演练时能够快速查询遗忘的知识点.学一门语言贵在坚持用它,不用就淡忘了 ...

  8. python 32位软件下载安装_Python32位官方下载-Python(开发环境工具)v3.9.1 x32 官方win版-ucbug软件站...

    Python是一款面向对象.直译式计算机程序设计语言,拥有极具特色的语法结构,设计了些具有特有极强的限制性的语法规则,有助于修正开发者不好的编程习惯,使得程序更加清晰和美观,为提供更加高效的编程服务. ...

  9. Python是什么?一篇文章带你全面了解Python

    Python在各种编程语言里是一种怎样的存在?"各种编程语言"这个范围就有点大了. 现在,全世界差不多有600多种编程语言,流行的编程语言也有20来种.但如果你听说过TIOBE排行 ...

最新文章

  1. [转]优化Flash性能
  2. 各种交换机的数据接口类型
  3. mapreduce任务出错最大尝试次数
  4. JSP的3大指令Page,include,taglib
  5. wp自定义帖子没标签_谷歌对nofollow标签重新定义,百度是否有变化哪?
  6. C#方法重载(overload)方法重写(override)隐藏(new)
  7. P1993 小 K 的农场
  8. linux 下 storm环境搭建,Storm在Ubuntu环境下的单机部署
  9. 测试人员,今天再不懂BDD就晚了!
  10. 解决子级用css float浮动 而父级div没高度不能自适应高度
  11. Embeded linux之地址映射
  12. jQuery EasyUI 下拉菜单获取日期,最高年份为当前年份,最低年份为当前年份向前推10年...
  13. 职场新鲜人必读:那些被“误读”的真经
  14. element-UI-tab选项卡
  15. 对本课程的期望以及教学建议
  16. Vmware安装Ubuntu16.0.4出现Assuming drive cache: write through和1920X1080分辨率调节问题
  17. State Threads 回调终结者(ST线程库)
  18. via/route blockage/size blockage/wire/pin guide/pin blockage/partition
  19. 使用火车头采集器笔记
  20. mysql字符集校对和规则

热门文章

  1. Angular应用带参数的路由实现
  2. 一步步创建ABAP post exit增强
  3. Jerry's spark demo application
  4. SAP CRM中间件下载时数据库表CRMATAB为空的处理方法
  5. 国内SAP从业者们2020年最想学习的SAP相关知识分类的调查问卷结果
  6. SAP CRM Attachment read - performance issue
  7. SAP Fiori application do filtering will real delete note in DB
  8. encountered unknown setting 'componentData' for class 'cus.crm.mycalendar.C
  9. BP: 通过SAP name拿到central person id
  10. SAP S/4HANA生产订单状态含义