是否有python的统计分析器?如果没有,我怎么能写一个呢?

我需要运行一个python脚本一段随机的时间,暂停它,得到一个堆栈回溯,并取消它。我已经用Google搜索了一些方法来做到这一点,但我认为没有明显的解决方案。     
已邀请:
statprof
模块
pip install statprof
(或
easy_install statprof
),然后使用:
import statprof

statprof.start()
try:
    my_questionable_function()
finally:
    statprof.stop()
    statprof.display()
这篇博客文章中的模块有一些背景知识:   但为什么这会有关系呢? Python已经有两个内置的分析器:lsprof和长期不赞成的热门。 lsprof的问题在于它只跟踪函数调用。如果你在函数中有一些热循环,那么lsprof几乎一文不值,无法确定哪些是真正重要的。      几天前,我发现自己完全处于lsprof失败的状态:它告诉我我有一个热门功能,但功能对我来说并不熟悉,并且足够长,以至于问题出在哪里并不是很明显。      在Twitter和Google+上做了一些乞讨之后,有人指着我做了一个statprof。但是有一个问题:虽然它正在进行统计抽样(耶!),它只是在采样时跟踪函数的第一行(wtf!?)。所以我解决了这个问题,提炼了文档,现在它既可用又不误导。以下是其输出示例,更准确地定位该热门函数中的违规行:
  %   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堆栈的回溯。我认为自动执行此程序非常容易,因为您可以(最坏的情况下)使用
expect
或其他任何方式将文本输入
gdb
。     
Python已经包含了您所描述的所需内容,无需破解解释器。 您只需将
traceback
模块与
sys._current_frames()
功能结合使用即可。您所需要的只是一种以所需频率转储所需回溯的方法,例如使用UNIX信号或其他线程。 要快速启动代码,您可以完成此提交中的操作: 从该提交复制
threads.py
模块,或者至少复制堆栈跟踪转储功能(ZPL许可证,非常自由): 把它连接到一个信号处理程序,比如说,
SIGUSR1
然后你只需要运行你的代码并根据需要随时用SIGUSR1“杀死”它。 对于使用相同技术不时“采样”单个线程的单个函数的情况,使用另一个线程进行计时,我建议解析Products.LongRequestLogger及其测试的代码(由您自己开发,同时在Nexedi的雇用): 无论这是否是正确的“统计”剖析,Mike Dunlavey的答案都被直觉引用,这引发了一个令人信服的论点,即这是一种非常强大的“性能调试”技术,而且我有个人经验,它真的有助于快速放大真实性能问题的原因。     
要为Python实现外部统计分析器,您将需要一些通用调试工具来让您查询另一个进程,以及一些Python特定工具来获取解释器状态。 这一般不是一个简单的问题,但您可能想尝试从GDB 7和相关的CPython分析工具开始。     
有一个用C语言编写的跨平台采样(统计)Python分析器,名为vmprof-python。 由PyPy团队成员开发,它支持PyPy和CPython。 它适用于Linux,Mac OSX和Windows。它用C语言编写,因此开销非常小。 它描述了Python代码以及从Python代码生成的本机调用。 此外,除了函数名称之外,它还有一个非常有用的选项来收集有关函数内部执行行的统计信息。 它还可以分析内存使用情况(通过跟踪堆大小)。 它可以通过API或控制台从Python代码中调用。 有一个Web UI可以查看配置文件转储:vmprof.com,它也是开源的。 此外,一些Python IDE(例如PyCharm)与它集成,允许运行探查器并在编辑器中查看结果。     
在提出问题七年后,现在有几个可用于Python的优秀统计分析器。除了vmprof,Dmitry Trofimov在这个答案中已经提到过,还有vprof和pyflame。所有这些都以某种方式支持火焰图,让您可以清楚地了解时间花在哪里。     
Austin是CPython的帧堆栈采样器,可用于为Python制作统计分析器,不需要任何检测并且引入最小的开销。最简单的方法是使用FlameGraph管道Austin的输出。但是,您可以使用自定义应用程序获取Austin的输出,从而使您自己的探测器能够满足您的需求。 这是Austin TUI的截图,这是一个终端应用程序,它提供了在正在运行的Python应用程序中发生的所有事情的顶级视图。 这是Web Austin,一个Web应用程序,向您显示收集的样本的实时火焰图。您可以配置为应用程序提供服务的地址,然后允许您进行远程分析。     

要回复问题请先登录注册