Python cProfile 和 profile 模型跳过函数
基本上,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语言。