原文:
www.kdnuggets.com/2021/12/3-tools-track-visualize-execution-python-code.html
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织 IT
你是否见过如下的错误输出:
2 divided by 1 is equal to 2.0.
Traceback (most recent call last):
File "loguru_example.py", line 17, in <module>
divide_numbers(num_list)
File "loguru_example.py", line 11, in divide_numbers
res = division(num1, num2)
File "loguru_example.py", line 5, in division
return num1/num2
ZeroDivisionError: division by zero
并希望输出能像这里所示的那样更容易理解?
作者的图片
你可能还希望实时可视化哪些代码行正在执行以及它们被执行了多少次:
作者的 GIF
如果是这样,这篇文章将提供工具来实现上述目标。这三个工具是:
-
Loguru — 打印更好的异常
-
snoop — 打印函数中正在执行的代码行
-
heartrate — 实时可视化 Python 程序的执行
使用这些工具只需要一行代码!
Loguru 是一个旨在让 Python 日志记录变得愉快的库。Loguru 提供了许多有趣的功能,但我发现最有用的功能是捕捉意外错误并显示导致代码失败的变量值。
要安装 Loguru,输入
pip install loguru
要理解 Loguru 的有用性,假设你有 2 个函数division
和divide_numbers
,并且函数divide_numbers
被执行。
注意combinations([2,1,0], 2)
返回[(2, 1), (2, 0), (1, 0)]
。在运行上述代码后,我们遇到了这个错误:
2 divided by 1 is equal to 2.0.
Traceback (most recent call last):
File "loguru_example.py", line 17, in <module>
divide_numbers(num_list)
File "loguru_example.py", line 11, in divide_numbers
res = division(num1, num2)
File "loguru_example.py", line 5, in division
return num1/num2
ZeroDivisionError: division by zero
从输出结果中,我们知道return num1/num2
是错误发生的地方,但我们不知道num1
和num2
的哪些值导致了错误。幸运的是,通过添加 Loguru 的logger.catch
装饰器,这可以很容易地追踪:
输出:
作者的图片
通过添加logger.catch
,异常更容易理解了!原来错误发生在将2
除以0
时。
如果代码没有错误,但我们想了解代码中发生了什么,这时 snoop 就派上用场了。
snoop是一个 Python 包,它通过添加一个装饰器打印被执行的代码行及每个变量的值。
要安装 snoop,请输入:
pip install snoop
让我们假设有一个叫做factorial
的函数,它计算整数的阶乘。
输出:
The factorial of 5 is 120
要理解factorial(5)
的输出是20
,我们可以将snoop
装饰器添加到factorial
函数中。
输出:
图片由作者提供
在上面的输出中,我们可以查看变量的值以及哪些代码行被执行。现在我们可以更好地理解递归是如何工作的!
如果你想可视化哪些行被执行以及执行了多少次,可以尝试使用 heartrate。
heartrate也是 snoop 的创建者开发的。要安装 heartrate,请输入:
pip install heartrate
现在让我们将heartrate.trace(browser=True)
添加到之前的代码中。这将打开一个浏览器窗口,显示调用trace()
的文件的可视化图。
运行上述代码时应该会弹出一个新的浏览器窗口。如果没有,请访问localhost:9999
。你应该会看到如下输出:
图片由作者提供
太棒了!这些条形图展示了被命中的行。条形图越长,命中次数越多,颜色越浅,表示越新近。
从上面的输出中,我们可以看到程序执行了:
-
if x==1
5 次 -
return 1
一次 -
return (x * factorial(x-1))
4 次
输出是有意义的,因为x
的初始值为 5,并且函数会重复调用,直到x
等于1
。
现在让我们看看使用 heartrate 实时可视化 Python 程序的执行是什么样的。让我们添加sleep(0.5)
,使程序运行得稍慢一点,并将num
增加到20
。
GIF 由作者提供
太棒了!我们可以实时看到哪些代码行正在执行,以及每行代码的执行次数。
恭喜!你刚刚学习了跟踪和可视化 Python 代码执行的 3 个工具。我希望使用这 3 个工具时调试会变得不那么痛苦。既然这些工具只需要一行代码,何不尝试一下,看看它们有多么有用?
随意玩耍并在这里叉开这篇文章的源代码。
给这个 仓库 点个星。
Khuyen Tran 是一位多产的数据科学作家,她编写了 一系列令人印象深刻的有用数据科学主题及其代码和文章。Khuyen 目前正在寻找一份机器学习工程师、数据科学家或开发者倡导者的职位,地点在 2022 年 5 月后湾区,如果你在寻找拥有她技能的人,请与她联系。
原文。经许可转载。