9个用于剖析Python代码的灵巧库

267 阅读5分钟

从简单的计时器和基准测试模块到复杂的基于统计的框架,通过这些工具来了解你的Python程序的性能。

高级撰稿人,InfoWorld |

![9 nifty libraries for profiling Python code](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/946668ea239f4346ac08e489a9cdb8d2~tplv-k3u1fbpfcp-zoom-1.image)

思想库

目录

显示更多

每种编程语言都有两种速度:开发的速度和执行的速度。Python总是倾向于快速编写与快速运行。尽管Python代码几乎总是足够快,但有时它并不快。在这种情况下,你需要找出它落后的地方和原因,并为之做些什么。

软件开发和一般工程的一个备受推崇的格言是 "测量,不要猜测"。对于软件来说,假设什么是错的很容易,但这样做绝不是一个好主意。关于实际程序性能的统计数据总是你在追求使应用程序更快过程中最好的第一工具。

好消息是,Python 提供了一大堆软件包,你可以用它们来分析你的应用程序,了解它最慢的地方。这些工具包括从标准库中的简单单行代码到从运行中的应用程序中收集统计信息的复杂框架。在这里,我介绍了九个最重要的工具,其中大部分都是跨平台运行的,并且在PyPI或Python的标准库中很容易获得。

时间和Timeit

有时你只需要一个秒表。如果你所做的只是对两个代码片断之间的时间进行分析,而这两个片断的运行需要几秒钟或几分钟,那么秒表就足够了。

Python 标准库中有两个函数可以作为秒表使用。时间模块perf_counter 函数,它调用操作系统的高分辨率定时器来获得一个任意的时间戳。在一个动作之前和之后各调用一次time.perf_counter ,获得两者之间的差异。这给了你一个不显眼的、低开销的--尽管也是不复杂的--为代码计时的方法。

Timeit 模块试图对 Python 代码进行类似于实际基准测试的操作。timeit.timeit 函数接收一个代码片段,将其运行多次 (默认为100万次),并获得这样做所需的总时间。它最好用于确定一个单一的操作或函数调用在一个紧密的循环中的表现--例如,如果你想确定一个列表的理解或传统的列表构造在多次完成的情况下会更快。(列表理解通常获胜)。

Time的缺点是它只是一个秒表,而Timeit的缺点是它的主要用途是对个别行或代码块进行微测试。这些模块只有在你孤立地处理代码时才起作用。这两个模块都不能满足整个程序分析的需要--找出你的程序在数千行代码中花费的大部分时间。

cProfile

Python 标准库也附带了一个全程序分析剖析器,cProfile。当运行时,cProfile 追踪你程序中的每个函数调用,并生成一个列表,列出哪些函数被最频繁地调用,以及这些调用平均需要多长时间。

cProfile有三个很大的优点。第一,它包含在标准库中,所以它甚至可以在Python的原始安装中使用。第二,它对调用行为进行了许多不同的统计--例如,它把一个函数调用自己的指令所花费的时间与该函数调用的所有其他调用所花费的时间分开。这可以让你确定一个函数本身是慢的,还是它调用其他函数是慢的。

第三,也许是最重要的,你可以自由地约束cProfile。你可以对整个程序的运行进行采样,也可以只在某个选定的函数运行时开启剖析,以便更好地关注该函数在做什么以及它在调用什么。这种方法只有在你把范围缩小后才能发挥最大的作用,但也省去了你在完整的剖析跟踪中涉足噪音的麻烦。

这给我们带来了cProfile的第一个缺点。它在默认情况下产生了大量的统计数据。试图在所有这些干草中找到正确的针,可能会让人不知所措。另一个缺点是cProfile的执行模型。它捕获了每一个函数调用,产生了大量的开销。这使得cProfile不适合在生产过程中使用实时数据进行剖析,但对于开发过程中的剖析则完全没有问题。

关于cProfile的更详细的介绍,请看我们的另一篇文章

FunctionTrace

FunctionTrace 的工作原理与 cProfile 大致相同。你把你想要剖析的脚本的名字传给它,而不需要在代码中添加仪器,它可以生成一个详细的函数调用内存使用情况的跟踪。FunctionTrace 还可以处理多线程/多进程的应用程序,而不需要你做任何额外的工作。关于FunctionTrace 工作的技术细节,请看这篇文章

和cProfile一样,FunctionTrace不使用采样,每一个动作都被记录下来。剖析组件是用Rust编写的,以提高速度。FunctionTrace的开发者声称,对应用程序的剖析开销小于10%。

追踪数据是以JSON格式保存的,所以理论上你可以用任何应用程序来解析它。但FunctionTrace最大的优势在于它使用Firefox Profiler--它可以在任何支持JavaScript的浏览器中运行,而不仅仅是Firefox--将结果呈现为交互式图表。

请注意,FunctionTrace的剖析组件还不能在Windows上使用;剖析只能在Linux或Mac系统上进行。

functiontraceIDG

FunctionTrace使用Firefox Profiler(可以在任何支持JavaScript的浏览器中运行)来实现跟踪统计的互动和探索。

Serdar Yegulalp是InfoWorld的高级作家,专注于机器学习、容器化、devops、Python生态系统和定期评论。

Copyright © 2022 IDG Communications, Inc.