性能分析器#

性能分析器窗格递归地确定文件中调用的每个函数和方法的运行时间及调用次数,将每个过程分解为最小的独立单元。这使您能够轻松识别代码中的瓶颈,指出对优化至关重要的确切语句,并测量后续更改后的性能差异。

Spyder Profiler pane, displaying a list of functions and their execution time

运行性能分析器#

您可以使用性能分析器路径框(窗格左上方)右侧的打开按钮浏览文件,这将自动对此文件进行性能分析。

Spyder Profiler pane, showing browsing a file and running profiler

您可以手动在窗格的路径框中输入路径,然后通过单击性能分析器窗格中的分析按钮对文件运行分析。

您还可以通过单击菜单栏中的行 ‣ 分析,或使用可配置的快捷键(默认为F10),对当前在编辑器中打开的文件进行性能分析。

Spyder Profiler pane, showing running profiler from menu bar

如果您想取消正在进行的运行,请单击右上角的停止按钮;如果性能分析因任何原因失败,将显示输出对话框,指示发生的错误。

双击性能分析器中的项目,您将跳转到编辑器中调用它的文件和行。

Spyder Profiler pane, showing opening a file when clicking on its analysis

您可以通过单击名称左侧的下拉箭头来增加特定对象显示的层级数量,并通过左上角的按钮展开/折叠所有项目。

Spyder Profiler pane, showing dropdown arrows and buttons for expanding and collapsing

通过单击下拉菜单或按下文件名字段中的向下 箭头键,您可以召回之前已分析文件的路径。

Spyder Profiler pane, showing dropdown of previous profiled files

最后,您可以使用保存数据按钮,将给定运行的数据保存到磁盘,文件扩展名为.Result。可以使用加载数据按钮加载此数据,以便与同一文件的先前运行进行比较。要移除已加载数据,请单击清除比较按钮。

Spyder Profiler pane, showing running profiler from menu bar

解释结果#

结果按函数/方法/语句分解,每个子元素都层级地列在其调用它们的顶级项之下。总时间是指定项目及其“下方”(即由其调用)的每个函数所花费的时间,而本地时间仅计算在特定可调用对象自身作用域内花费的时间。调用次数列显示了在父调用函数内部该级别下(或如果是顶级对象,则在__main__作用域内)调用指定对象的总次数。最后,如果加载了比较数据,则显示这三列各自的差异列中的数字,并指示每次测量之间的差异。

Profiler with a comparison loaded, displaying the time deltas between two runs

例如,假设您在一个文件中运行性能分析器,该文件调用了一个函数sleep_wrapper(),而sleep_wrapper()又调用了sleep()函数。如果sleep_wrapper()函数总共运行了3.87毫秒,其中3.86毫秒用于执行其内部的sleep()函数。因此,如果sleep()自身没有调用其他函数,其总时间本地时间都将相同,为3.87毫秒。同时,sleep_wrapper()总时间将为3.86毫秒,但本地时间仅为0.01毫秒,因为其余时间花费在其调用的sleep()函数内部。

性能分析器插件#

您可以安装两个额外的插件,以在 Spyder 中启用其他类型的性能分析。首先,Spyder 行分析器允许您单独对代码的每一行进行基准测试。要了解更多信息,请访问spyder-line-profiler git 仓库

Spyder Profiler pane, displaying a list of functions and their execution time

其次,Spyder 内存分析器测量代码的内存使用情况。要了解更多信息,请访问spyder-memory-profiler git 仓库

Spyder Profiler pane, displaying a list of functions and their execution time