Python cProfile 和 profile 模型跳过函数

3 投票
2 回答
897 浏览
提问于 2025-04-15 15:44

基本上,cProfile模块在我运行的时候会跳过一些函数,而普通的profile模块则会出现这个错误。

    The debugged program raised the exception unhandled AssertionError
"('Bad call', ('objects/controller/StageController.py', 9, '__init__'), <frame object at 0x9bbc104>, <frame object at 0x9bb438c>, <frame object at 0x9bd0554>, <frame object at 0x9bcf2f4>)"
File: /usr/lib/python2.6/profile.py, Line: 301

我已经搜索了很多,但找不到任何解决办法。我该怎么让它们正常工作呢?

@ yk4ever

StageController.py这个类是这样开始的:

class StageControl(ObjectControl):

    def __init__(self, canvas_name):
        ObjectControl.__init__(self, canvas_name,"stage_object")
        self.model = StageModel()
        self.variables()
        self.make_stage()
        self.overrides()

上面的“错误调用”似乎对这个类不太友好。

2 个回答

0

Python的一个错误报告 #1117670 似乎描述了同样的问题。那里还附上了一个简单的测试脚本,可以用来重现这个类似的问题。这个错误已经被标记为已修复。

请查看上面Python错误报告中的 msg24185,里面有一个解决方法,可以在Python 2.4上使用。

你使用的是哪个版本的Python?

2

我找到了问题所在。Psyco这个库中的'ObjectControl'类是我的'StageControl'类继承的,它里面有一段简单的代码:

import psyco
psyco.full()

这段代码在类内部,导致了错误,所以只有那些继承了'ObjectControl'的类中的方法,才让性能分析工具出问题。我在某个地方看到过,建议只在需要的地方引入psyco,结果发现这是个坏主意。

我之前用过psyco一段时间,直到我遇到了cython,但因为某种原因,我把psyco的引入代码留了太久,结果搞坏了性能分析工具。现在我已经不再使用psyco了。

这个故事的教训是:还是老老实实用cython吧,最终没有什么能比得上C语言。

撰写回答