是否有python的统计分析器?如果没有,我怎么能写一个呢?
我需要运行一个python脚本一段随机的时间,暂停它,得到一个堆栈回溯,并取消它。我已经用Google搜索了一些方法来做到这一点,但我认为没有明显的解决方案。
没有找到相关结果
已邀请:
7 个回复
屠创氓读叔
模块
(或
),然后使用:
这篇博客文章中的模块有一些背景知识: 但为什么这会有关系呢? Python已经有两个内置的分析器:lsprof和长期不赞成的热门。 lsprof的问题在于它只跟踪函数调用。如果你在函数中有一些热循环,那么lsprof几乎一文不值,无法确定哪些是真正重要的。 几天前,我发现自己完全处于lsprof失败的状态:它告诉我我有一个热门功能,但功能对我来说并不熟悉,并且足够长,以至于问题出在哪里并不是很明显。 在Twitter和Google+上做了一些乞讨之后,有人指着我做了一个statprof。但是有一个问题:虽然它正在进行统计抽样(耶!),它只是在采样时跟踪函数的第一行(wtf!?)。所以我解决了这个问题,提炼了文档,现在它既可用又不误导。以下是其输出示例,更准确地定位该热门函数中的违规行:
我已经将statprof上传到Python包索引,因此安装起来几乎是微不足道的:“easy_install statprof”并且你已经启动并运行了。 由于代码在github上,欢迎提供bug报告和改进。请享用!
babsoft
),而不必解析输出。不幸的是,Python没有任何方法可以从发生异常的地方继续,因此您无法在记录后继续执行。 为了从正在运行的程序中实际获取堆栈跟踪,您可能不得不破解实现。因此,如果您真的想这样做,那么可能值得花时间查看pypy,这是一个主要用Python编写的Python实现。我不知道在pypy中这样做会有多方便。我猜它不会特别方便,因为它会涉及到基本上每个指令都引入一个钩子,我认为这是非常低效的。此外,我认为除了需要很长时间才能到达您想要开始执行堆栈跟踪的状态之外,第一个选项没有太多优势。
调试器有一组宏,旨在方便调试Python本身。 gdb可以附加到一个外部进程(在这种情况下是执行你的应用程序的python实例),并且几乎可以用它做任何事情。似乎宏
将在当前执行点为您提供Python堆栈的回溯。我认为自动执行此程序非常容易,因为您可以(最坏的情况下)使用
或其他任何方式将文本输入
。
诉嘎归亮
模块与
功能结合使用即可。您所需要的只是一种以所需频率转储所需回溯的方法,例如使用UNIX信号或其他线程。 要快速启动代码,您可以完成此提交中的操作: 从该提交复制
模块,或者至少复制堆栈跟踪转储功能(ZPL许可证,非常自由): 把它连接到一个信号处理程序,比如说,
然后你只需要运行你的代码并根据需要随时用SIGUSR1“杀死”它。 对于使用相同技术不时“采样”单个线程的单个函数的情况,使用另一个线程进行计时,我建议解析Products.LongRequestLogger及其测试的代码(由您自己开发,同时在Nexedi的雇用): 无论这是否是正确的“统计”剖析,Mike Dunlavey的答案都被直觉引用,这引发了一个令人信服的论点,即这是一种非常强大的“性能调试”技术,而且我有个人经验,它真的有助于快速放大真实性能问题的原因。
翱抹村
诉嘎归亮
遣莫捅炭
镀建啼