|
<p>请教一个Python profile模块的问题</p>
<p><img src="http://img.baidu.com/img/iknow/icn_point.gif"> 悬赏分:10 -</p>
<p>解决时间:2009-12-17 14:02</p>
<p>请教大家一下~我有这样的代码</p>
<p>import profile</p>
<p>def f1():</p>
<p>def f2():</p>
<p>print("f2")</p>
<p>profile.run("f2()")</p>
<p>f1()</p>
<p>会说找不到f2()</p>
<p>但如果不用profile.run,直接调用f2,就什么问题没有</p>
<p>请问下这怎么办?如何profile.run一个嵌套的函数?</p>
<p>谢谢!</p>
<p>提问者: guohouzuo - 五级</p>
<p>最佳答案</p>
<p>def f1():</p>
<p>print "f1"</p>
<p>def f2():</p>
<p>print "f2"</p>
<p>profile.runctx("f2()",globals(),locals())</p>
<p>>>> f1()</p>
<p>f1</p>
<p>f2</p>
<p>4 function calls in 0.000 CPU seconds</p>
<p>Ordered by: standard name</p>
<p>ncalls tottime percall cumtime percall filename:lineno(function)</p>
<p>1 0.000 0.000 0.000 0.000 :0(setprofile)</p>
<p>1 0.000 0.000 0.000 0.000 <stdin>:3(f2)</p>
<p>1 0.000 0.000 0.000 0.000 <string>:1(?)</p>
<p>1 0.000 0.000 0.000 0.000 profile:0(f2())</p>
<p>0 0.000 0.000 profile:0(profiler)</p>
<p>看一下profile.py源代码</p>
<p>class Profile的方法</p>
<p>def run(self, cmd):</p>
<p>import __main__</p>
<p>dict = __main__.__dict__</p>
<p>return self.runctx(cmd, dict, dict)</p>
<p>def runctx(self, cmd, globals, locals):</p>
<p>self.set_cmd(cmd)</p>
<p>sys.setprofile(self.dispatcher)</p>
<p>try:</p>
<p>exec cmd in globals, locals</p>
<p>finally:</p>
<p>sys.setprofile(None)</p>
<p>return self</p>
<p>你可以看到 run方法中,只有 __main__的 context,也就是说,只能认识定义在全局的变量, 而你用了嵌套函数后,f2只是 f1函数的局部变量,在 __main__的环境中,并没有f2,因此执行出错</p>
<p>而使用profile.runctx("f2()",globals(),locals()),则将 f1的globals和locals给与runctx,这样就可以正确执行了。</p>
<p>0</p>
<p>回答者:</p>
<p>ttvast - 二级 2009-12-16 15:11</p>
<p>我来评论>></p>
<p>提问者对于答案的评价:</p>
<p>Danke~</p>
|
|