通常,人们会使用两种速度来衡量某种编程语言的优劣,即:开发速度和执行速度。对于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具有三大优势:
cProfile的不足之处有:
有关cProfile的更多详细信息。
3.Pyinstrument
与cProfile的工作方式类似,Pyinstrument能够通过跟踪目标程序,以报告的形式,反映出那些占用了大部分运行时间的代码。不过,与cProfile相比,Pyinstrument的优点主要体现在如下两个方面:
Pyinstrument同样具有cProfile的各种优点。您可以将它用作应用程序中的对象,来记录所选功能,而不是整个程序的行为。Pyinstrument提供包括HTML格式在内的多种输出形式。当然,您也可以按需查看各个调用的完整时间线。
此外,如下两个方面值得您的注意:
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的最大缺点之一是:它主要适用于从外部分析整个程序、或是某些组件,不适合对某个特定的功能函数进行采样。
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种带你轻松分析Python代码的软件库
网站链接:http://www.shufengxianlan.com/qtweb/news33/18233.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联