公司网站图片传不上去,深圳代理网络推广公司,百度搜索风云榜游戏,成都排名seo公司通常#xff0c;人们会使用两种速度来衡量某种编程语言的优劣#xff0c;即#xff1a;开发速度和执行速度。对于Python而言#xff0c;大家往往受益的是它能够快速地编写代码#xff0c;而忽略了它是否能够快速地运行#xff0c;并及时完成既定的任务。因此#xff0c;…通常人们会使用两种速度来衡量某种编程语言的优劣即开发速度和执行速度。对于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.cProfilePython标准库还带有一个整体程序分析器--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.YappiYappi是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。