如何对Python和C代码进行分析
我有一个应用程序,它由多个Python脚本组成。其中一些脚本会调用C语言代码。现在这个应用程序的运行速度比之前慢了很多,所以我想对它进行性能分析,看看问题出在哪里。有没有什么工具、软件包或者方法可以用来分析这样的应用程序?我希望这个工具能跟踪Python代码到C代码,并分析这些调用的性能。
注意1:我对标准的Python性能分析工具很了解。这里我特别想找的是可以同时分析Python和C的工具。
注意2:这些Python模块是通过ctypes来调用C代码的(详细信息可以查看http://docs.python.org/library/ctypes.html)。
谢谢!
2 个回答
这个组合可能会比较难,不过你可以使用一些常见的性能分析工具,比如 valgrind
、gprof
,甚至 oprofile
(虽然我从来没有成功从中得到有用的输出)。
Stackshots 是有效的。因为你同时使用了 Python 和 C,所以可以分别处理它们。对于 Python,当程序运行得很慢时,你可以按 Ctrl-C 来查看当前的执行情况。这样做几次,就能发现 Python 代码中可以改进的地方。对于 C 代码,可以在调试器(比如 GDB)中运行整个程序,然后按 Ctrl-C 来获取 C 代码的调用栈。多做几次这样的操作,就能找到 C 代码中可以改进的地方。有人告诉我 OProfile 也可以做到这一点。(如果有的话,另一种方法是使用 lsstack。)
这是一种鲜为人知的方法,原理是这样的:假设你有一个无限循环或者几乎无限的循环。你怎么找到它呢?你会暂停程序,看看它在做什么,对吧?假设程序的运行时间比正常多了一倍。每次你暂停它,有50%的机会能抓到它在做那些不必要的事情。所以你只需要暂停几次。当你看到它在做一些可以改进的事情时,可能只需要2次样本,你就知道可以通过改进来加快速度。然后你可以继续这个过程,找到下一个问题。测量并不是重点,抓住那些可以改进的地方才是关键。