gpt4 book ai didi

python - 什么决定了调试器的运行时性能

转载 作者:太空狗 更新时间:2023-10-29 18:23:32 26 4
gpt4 key购买 nike

我已经尝试使用 Wing IDE (v.4.1.3) 和 Komodo IDE (v.7.0.0) 调试 Python 3。正如预期的那样,调试器会增加很多运行时开销。但令我惊讶的是调试器之间的差异如此之大。

这是同一程序的运行时间。没有断点或其他任何东西,只是没有任何实际调试的常规运行:

  • 由 python 解释器执行:26 秒
  • 由调试器 #1 执行:137 秒
  • 由调试器 #2 执行:1143 秒

我将调试器称为匿名的 #1 和 #2,以免这成为对其中之一的无意(并且可能被误导)的广告。

其中一个调试器真的“快”了 8 倍吗?

或者是否存在一些设计权衡,即更快的调试器放弃某些功能、精度、稳健性或其他任何东西,以换取更快的速度?如果是这样,我很想知道这些细节,无论是专门针对 Wing/Komodo 还是一般的 Python 调试器。

最佳答案

做一个优化的 Python 调试器就像任何其他软件一样:在性能方面可能真的不同(我是 PyDev 的作者,我已经完成了 PyDev 调试器,所以,我可以评论它,但不能评论其他的,所以,我将只解释一下优化 Python 调试器——因为我花了很多时间优化 PyDev 调试器——我不会真正谈论其他实现,因为我不知道它们是如何实现的已经完成——除了 pdb,但 pdb 在遇到断点并且你正在单步执行它之后并不是真正的快速调试器实现,尽管它在你实际执行将开始跟踪的代码之前运行未跟踪的东西确实工作得很好你的代码)。

特别是,任何“天真的”调试器都可以通过在每一帧中启用 Python 跟踪并检查每行执行是否有断点匹配来使你的程序变慢(这大致是 pdb 的工作方式:每当你进入一个上下文它将跟踪它并为调用的每一行检查断点是否匹配它,因此,我相信任何期望快速的实现都不能真正依赖它。

我知道 PyDev 调试器有几个优化......主要的是以下一个:当调试器进入一个新的框架(即:函数)时,它会检查是否有任何可能命中的“潜在”断点,如果没有,它甚至不会跟踪该函数(另一方面,当程序执行后稍后添加断点时,它必须去重新评估所有先前的假设,因为任何当前帧都可能最终跳过一个断点)。如果它确定应该跟踪某个帧,它将为该帧创建一个新实例,该实例将负责缓存与该帧相关的所有内容(这只有在 Python 2.5 中才有可能,因此,在 Python 2.4 上工作时和更早版本,除非安装了 threadframe 扩展,否则调试器将尝试模拟它,这将使其在 Python 2.4 上运行得相当慢)。

此外,PyDev 调试器目前利用了 Cython,尽管这仅限于 CPython...Jython、IronPython 和 PyPy 不利用它),因此,考虑到纯 Python 模式,仍然进行了许多优化(值得庆幸的是,Cython 与 Python 非常接近,因此只需进行少量更改即可使其在 CPython 上使用 Cython 更快地运行)。

一些关于 PyDev 调试器优化演变的相关帖子:

http://pydev.blogspot.co.id/2017/03/pydev-560-released-faster-debugger.html

http://pydev.blogspot.co.id/2016/01/pydev-451-debug-faster.html

http://pydev.blogspot.com/2008/02/pydev-debugger-and-psyco-speedups.html

http://pydev.blogspot.com/2005/10/high-speed-debugger.html

无论如何,使用适当的调试器运行总是会增加一些开销(即使经过高度优化,例如 PyDev 调试器),因此,PyDev 还提供了可以在 pdb 中使用的相同方法:在代码中添加一个断点,它只会在那个点开始跟踪(这是 PyDev 的远程调试器功能):http://pydev.org/manual_adv_remote_debugger.html

并且根据您希望调试器支持的功能,它也可能更慢(例如:当您在 PyDev 中为捕获的异常启用中断时,程序将执行得更慢,因为它需要跟踪更多的东西才能按顺序执行正确打破)。

关于python - 什么决定了调试器的运行时性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9346622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com