使用MacOSX Instruments对Python代码进行性能分析

28

MacOSX Xcode Instruments非常适合对本地代码进行性能分析。但在我的调用堆栈中也有大量的Python调用。我能否以某种方式使Instruments具备Python感知能力?

我能想到的一个解决方案是,当Instruments看到一些PyEval_EvalFrameEx框架时,它会查看其本地变量/参数以区分不同的Python调用,并向我显示一些调用信息。

我不仅仅是要求一个Python分析器。我想对我的本地代码进行性能分析。但在这种本地代码分析中,我希望添加一些进一步的智能来分析和转换Python堆栈帧。


3
你试过RunSnakeRun吗?我个人从未使用过,但它似乎是你要找的东西。 - James Mertz
@KronoS:我认为我已经看到了类似的解决方案,可以将cProfile和导出器转换为KCacheGrind。但是:(1)我还想看到本地C代码概要文件,即两者结合。(2)我也特别想使用Xcode Instruments。 - Albert
1
也许我没有完全理解你的问题,但是你可以尝试用 python -m cProfile myscript.py 运行你的脚本,然后将输出保存到日志文件中。 - ollien
@ollien: 那我就看不到本地的(C/C++/ObjC)函数调用了。 - Albert
3个回答

4
根据这个 stackoverflow答案,Instruments是dtrace的GUI前端。有Apple文档证实了这一点,并且在Big Nerd Ranch等其他地方有一些关于dtrace的OS-X特定文章。

在编译CPython源代码之前,可以应用补丁对其进行仪器化以适用于dtrace。看起来,有自动构建新的带有dtrace的Python的支持,或者曾经在homebrew中使用,但是现在通过谷歌搜索,我没有找到当前Python版本(2.7.10、3.4/3.5)具有dtrace提供程序支持的homebrew配方参考。我没有尝试过,因此可能当前的配方只需要在构建时使用--with-dtrace开关即可正常工作。

有一个来自PyTexas 2013的演讲:dtrace,Python和您,其中讨论了如何获得包含dtrace支持的Python安装(特别是在Mac上),以及如何在命令行上使用dtrace。

我认为,一旦你安装了支持dtrace的Python,并运行它,你应该可以在Instruments中看到并使用它。如果你将Python解释器添加到OS X应用程序中(作为.framework或其他形式的链接),如果这个Python在编译之前应用了dtrace补丁,我也认为它将可用于在dtrace中使用。我都没有尝试过,但根据我对dtrace的了解,我相信它应该可以工作。如果我确认这是正确的,我会回复。

2

没有MacOSX工具来分析Python代码。个人建议使用cProfile,它是一个内部分析器,称为cProfile。您可以按照以下任一方式使用:

import cProfile
cProfile.run('print "Hello World!"')

或者

python -m cProfile your_own_script.py

结果可能是这样的:
>>> cProfile.run('print "Hello World!"')
Hello World!
         2 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

编辑:如果您正在寻找本地级别的调用,那么您应该转移到strace(适用于Linux)和dtruss(适用于Mac OSX)或类似的工具。基本上,您可以在strace调用中包装Python脚本,然后您将能够查看所有“本机”C/C ++调用。 对于其他Linux系统,请使用:

strace -fetrace=open python your_script.py

如果您正在使用Mac OSX:

dtruss -f -t open python your_script.py

我希望这能有所帮助!

这不是问题所在。问题是关于本地代码的。 - Albert
如果你正在寻找本地级别的调用,那么你应该转向strace或类似的工具。基本上,你可以在strace调用中包装你的Python脚本,这样你就能查看所有你的“本地”C/C++调用。 - tricklepie
我找到了Traceback。不确定它是否有帮助。 - tricklepie
这仅适用于Python,并打印Python堆栈跟踪。不确定如何在strace或其他情况下工作。 - Albert
@rakslice:MacOSX Instruments是一种本地分析工具。你知道这个工具吗?你只能使用它进行本地分析。此外,人们在回答问题之前真的应该阅读完整个问题。 - Albert
显示剩余2条评论

0

有一个很棒的新GUI分析器叫做PyVmMonitor。我还没有成功地将其附加到我的正在运行的应用程序上,但我已经在使用它来生成并从命令行分析文件,类似这样:

python /Applications/PyVmMonitor.app/Contents/MacOS/public_api/pyvmmonitor --profile=yappi my_app.py

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接