认为您的 Python 代码很慢?停止猜测并开始测量

使用 cProfile + SnakeViz 查找(并修复)代码中的“热门”路径的实践之旅。文章认为您的 Python 代码很慢? 《停止猜测并开始测量》首先出现在《迈向数据科学》上。

来源:走向数据科学

前几天我正在写一个剧本,这让我抓狂。当然,它确实有效,但只是……很慢。真的很慢。我有一种感觉,如果我能找出阻碍所在,事情会快得多。

我的第一个想法是开始调整一些东西。我可以优化数据加载。或者重写 for 循环?但我阻止了自己。我以前也曾陷入过这个陷阱,花了几个小时“优化”一段代码,却发现它对整体运行时间几乎没有任何影响。 Donald Knuth 说得有道理,“过早的优化是万恶之源。”

我决定采取更有条理的方法。我不是去猜测,而是去确定。我需要对代码进行分析,以准确获取哪些函数消耗了大部分时钟周期的硬数据。

在本文中,我将引导您完成我使用的确切过程。我们将采用一个故意变慢的 Python 脚本,并使用两个出色的工具以外科手术般的精确度查明其瓶颈。

第一个工具称为 cProfile,它是 Python 中内置的功能强大的分析器。另一个称为snakeviz,这是一个出色的工具,可以将分析器的输出转换为交互式可视化地图。

设置开发环境

在开始编码之前,让我们先设置一下开发环境。最佳实践是创建一个单独的 Python 环境,您可以在其中安装任何必要的软件和实验,并知道您所做的任何事情都不会影响系统的其余部分。我将使用 conda 来实现此目的,但您可以使用您熟悉的任何方法。

#创建我们的测试环境

conda create -n profiling_lab python=3.11 -y

# 现在激活它conda 激活 profiling_lab现在我们已经设置了环境,我们需要为可视化安装 Snakeviz 并为示例脚本安装 numpy。 cProfile 已经包含在 Python 中,因此无需再做任何事情。由于我们将使用 Jupyter Notebook 运行脚本,因此我们还将安装它。这是输出。