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

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

32cfe307d9ce9e18a17c3e8b0b9bb632.png

好消息是,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不适合通过实时数据的方式,对生产环境中的应用程序进行性能分析。也就是说,它更适合于针对开发过程中的性能分析。有关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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python try else_python try/except/else与递归

Python版本:2.7。操作系统:Windows 10 64位。在 注意:我找到了一种方法来解决下面描述的问题,它不使用try/except/else语句。我问下面的问题仅仅是因为我很好奇为什么代码的行为方式是这样的,以及是否有一种方法可以使…

python闭包怎么理解_Python:闭包的理解

很多函数型的语言都有闭包这一概念,比如python的兄弟js。人们刚听到闭包这一概念总会觉得它很晦涩,难以理解。其实不然,主要是他的名字起得太抽象了,让人误以为很难。下面举一个例子:#coding:utf-8def foo():nums [0]…

mac ssh客户端_Electerm for Mac(ssh客户端)

Electerm for Mac是一款功能强大的,作为终端或ssh / sftp客户端(类似于xshell)为一体的工具,支持多平台(linux,mac,win),还有自定义终端样式,全局/会话代理,将书签/主题/快速命令同步到github s…

alpine登陆mysql_如何构建一个php7-alpine的docker镜像

我花了大概一周的时间进行了各种踩坑及实验,最终得出了一份可以使用的dockerfile及compose内含如下支持php7mysql_pdopostgre_pdophpredisswoole(可选,如应用swoole,dockerfile及nginx的配置会有所变化)dockerfile分为两部分,一部…

armbian nginx 部署博客_通过Git将Hexo博客部署到服务器

本文首发于我的个人博客https://orxing.top,欢迎来访服务器是用的阿里云ECS CentOS,本来是用来部署WordPress的,后来接触了Hexo,就把Hexo直接部署到了GitHub pages和Coding Pages上,但是最近发现Coding pages经常抽风&…

shell把mysql每句导出_shell实现,将mysql每个存储过程导出为单个文件_MySQL

#shell实现,将mysql中存储过程代码直接导出为文件dbcn"mysql -h172.16.1.194 -uroot -p123456 ";dbBCReport_Sync_Executor;ii0;ct$dbcn -N -e " select count(1) from mysql.proc as p where 11 and p.db$db and p.type like P%;";mkdir -p /c…

python弹出窗口后卡死_python的tkinter模块GUI编程为啥用了while循环之后就会使得程序出现卡死未响应崩溃?...

这位同学,首先无代码无真相。只能在这里猜测一下,你在GUI界面中点击了某个按钮,调用的函数然后触发了某种while循环,这个时候前台GUI将“未响应”卡死。不过一旦调用函数的while循环结束,GUI界面将再次可用。 不使用线…

python 字符串格式化语法_Python基础语法--字符串格式化

PS:在学习到Python的字符串格式化一些个人的总结,利用字符串格式化可以更好的对代码结果进行格式化输出语法栗子 例子中通过接收用户输入的值,赋值给sex_input和age_input生成两个变量,并根据判断输出相应的语句,and是…

springmvc跳转html_SpringMVC基础(三)

本篇文章主要整理了数据处理、乱码处理和Json的相关知识。参考的狂神说的公众号以及视频。所有代码亲测有效。数据处理主要包括处理提交的数据以及将数据显示到前端。处理提交的数据一般有三种情况:(1)提交的域的名称和方法的参数名称一致时:RequestMapp…

mysql-5.7.24初始化数据库_MySQL5.7.28 初始化数据库

1)初始化随机密码 mysqld --initialize[roothost-172-16-61-102 bin]# ./mysqld --initialize2020-02-15T07:01:38.309015Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documenta…

查看本机所有请求_【松勤教育】Fiddler抓包-只抓APP的请求

fiddler抓手机app的请求,估计大部分都会,但是如何只抓来自app的请求呢?把来自pc的请求过滤掉,因为请求太多,这样会找不到重要的信息了。环境准备:1.电脑上已装fiddler2.手机和电脑在同一局域网一、设置1.fi…

ubuntu18.04升级python_Ubuntu18.04一次性升级Python所有库的方法步骤

pip是什么pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。升级pip版本默认Ubuntu自带的pip (pip 9.0.1)是基于Python2.7的版本我们需要重新安装基于Python3的pip:sudo apt-get install python3-pip升级pip3版本&…

icmp报文格式_TCP/IP(二):IP报文格式详解

1. IP 报文格式0bit是指位于最左边的最高位,31bit是指位于最右边的最低位,4个字节的32bit按照 bigendian(大端格式:低字节位于高地址)字节序传输:首先是0~7bit,其次 8~15bit,然后 16~23bit,最后…

java多线程交替打印_java实现多线程交替打印

本文实例为大家分享了java实现多线程交替打印的具体代码,供大家参考,具体内容如下notifywait实现import org.junit.Test;import java.util.concurrent.*;public class TestThreadLocal {Object o new Object();CountDownLatch cnew CountDownLatch(2);T…

plot函数_时间序列:python移动窗口函数前言

一起学习,一起成长!在移动窗口(可以带有指数衰减权数)上计算的各种统计函数也是一类常见于时间序列的数组变换。它们称为移动窗口函数,其中还包括那些窗口不定长的函数(如指数加权移动平均)。跟其他统计函数一样,移动窗口函数也会…

织梦检测环境不支持mysql_本地测试织梦dedeCMS 安装环境

本地测试织梦dedeCMS 安装环境2018-08-21 134织梦好多想本地测试织梦DEDECMS网站,今天介绍如何在本地安装测试环境,安装织梦系统。第一:环境测试 DedeAMPZ 织梦官方测试软件DedeAMPZ 是直接整合PHP Apache MySql 的服务器环境管理软件&…

一页纸项目管理模板_项目管理职场必备读物!这一次全部送给你!

“大圣,此去欲何?”“踏南天,碎项目。”“若一去不归...”“便一去不复返归!”hello~hello~大家好上一次找到的一篇项目管理书籍送给大家毫无意外地大家纷纷在后台留言要求我还有没有更多的书籍答应你们,这次一次性全部…

浏览器无法运行java_window_浏览器无法运行JAVA脚本的解决方法,1、浏览器无法运行JAVA脚本的 - phpStudy...

浏览器无法运行JAVA脚本的解决方法1、浏览器无法运行JAVA脚本的解决方法。rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%System32dacui.dllrundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%Catrooticatalog.mdbregsvr32 /s comcat.dllregsvr32 /s asctrls.o…

python android自动化_python在Android下的自动化测试用法

# This Python file uses the following encoding: utf-8from com.android.monkeyrunner import MonkeyRunner,MonkeyDevicefrom com.android.monkeyrunner.easy import EasyMonkeyDevice #提供了根据ID进行访问from com.android.monkeyrunner.easy import By #根据ID返回PyObj…

第五届蓝桥杯校内选拔赛试题java组_第五届蓝桥杯校内选拔赛试题java组

第五届“蓝桥杯”全国软件和信息技术专业人才大赛校内选拔赛试题(Java组)第一部分:准备工作:1、在D:盘中建立一个以自己“学号姓名”命名的考生文件夹。如:学号:123456,姓名:张三,则…