max*_*max 10 python debugging performance python-3.x
我尝试使用Wing IDE(v.4.1.3)和Komodo IDE(v.7.0.0)调试Python 3.因为,预计调试器会增加大量的运行时开销.但令我惊讶的是调试器之间的差异.
以下是同一程序的运行时间.没有断点或其他任何东西,只是没有任何实际调试的常规运行:
我将调试器称为匿名#1和#2,以免这成为其中一个的无意(并可能被误导)广告.
其中一个调试器真的是8倍"更快"吗?
或者是否有一些设计权衡,更快的调试器放弃一些功能,或精度,或鲁棒性,或其他什么,以换取更快的速度?如果是这样,我想知道这些细节,无论是专门用于Wing/Komodo还是一般的Python调试器.
Fab*_*zny 14
做一个优化的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足够接近,因此需要进行一些更改才能使其在使用Cython的CPython上更快地运行.
关于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中为捕获的异常启用中断时,程序将执行得更慢,因为它需要跟踪更多内容才能正确破解).