shi*_*ino 17 python profile stochastic
我需要运行一个python脚本一段随机的时间,暂停它,得到一个堆栈回溯,并取消它.我已经用Google搜索了一些方法来做到这一点,但我认为没有明显的解决方案.
dbr*_*dbr 13
pip install statprof(或easy_install statprof),然后使用:
import statprof
statprof.start()
try:
my_questionable_function()
finally:
statprof.stop()
statprof.display()
Run Code Online (Sandbox Code Playgroud)
这篇博客文章中的模块有一些背景知识:
但为什么这会有关系呢?Python已经有两个内置的分析器:lsprof和长期不赞成的热门.lsprof的问题在于它只跟踪函数调用.如果你在一个函数中有一些热循环,那么lsprof几乎一文不值,无法确定哪些是真正重要的.
几天前,我发现自己完全处于lsprof失败的状态:它告诉我我有一个热门功能,但功能对我来说并不熟悉,并且足够长,以至于问题出在哪里并不是很明显.
在Twitter和Google+上做了一些乞讨之后,有人指着我做了一个statprof.但是有一个问题:虽然它正在进行统计抽样(耶!),它只是在采样时跟踪函数的第一行(wtf!?).所以我解决了这个问题,提炼了文档,现在它既可用又不误导.以下是其输出示例,更准确地定位该热门函数中的违规行:
Run Code Online (Sandbox Code Playgroud)% cumulative self time seconds seconds name 68.75 0.14 0.14 scmutil.py:546:revrange 6.25 0.01 0.01 cmdutil.py:1006:walkchangerevs 6.25 0.01 0.01 revlog.py:241:__init__ [...blah blah blah...] 0.00 0.01 0.00 util.py:237:__get__ --- Sample count: 16 Total time: 0.200000 seconds我已经将statprof上传到Python包索引,因此安装起来几乎是微不足道的:"easy_install statprof"并且你已经启动并运行了.
由于代码在github上,欢迎提供bug报告和改进.请享用!
我能想到的几个几个方法可以做到这一点:
而不是在程序运行时尝试获取堆栈跟踪,只需在其上触发一个中断,然后解析输出.您可以使用shell脚本或另一个调用您的应用程序作为子进程的python脚本来执行此操作.在解答C++特定问题的答案中,解释了基本思想并进行了相当彻底的辩护.
sys.excepthook记录堆栈跟踪的事后例程(使用),而不必解析输出.不幸的是,Python没有任何方法可以从发生异常的地方继续,因此您无法在记录后继续执行.为了真正得到从正在运行的程序的堆栈跟踪,你将可能不得不破解执行.因此,如果您真的想这样做,那么可能值得花时间查看pypy,这是一个主要用Python编写的Python实现.我不知道在pypy中这样做会有多方便.我猜它不会特别方便,因为它会涉及到基本上每个指令都引入一个钩子,我认为这是非常低效的.此外,我认为除了需要很长时间才能达到您想要开始执行堆栈跟踪的状态之外,第一个选项没有太多优势.
调试器有一组宏,gdb旨在方便调试Python本身.gdb可以附加到一个外部进程(在这种情况下是执行你的应用程序的python实例),并且几乎可以用它做任何事情.似乎宏pystack将在当前执行点为您提供Python堆栈的回溯.我认为自动执行此过程非常容易,因为您可以(最坏的情况下)将文本输入到gdb使用expect或其他任何内容中.