为什么'setprofile'会打印这个
import sys
def a():
print 'aaa'
def profiler(frame, event, arg):
print event, frame.f_code.co_name, frame.f_lineno, "->", arg
# profiler is activated on the next call, return, or exception
sys.setprofile(profiler)
a()
打印
call a 5 -> None#what is it
aaa
return a 6 -> None#what is it
return <module> 12 -> None#what is it
为什么要打印这个。
2 个回答
0
看起来你可能在想,为什么 arg
是 None。其实 arg
在不同的事件中有不同的含义。比如在“返回”这个事件中,arg
就是要返回的值。而在“异常”事件中,arg
是一个包含异常信息的三元组。想了解更多,可以查看这个链接:http://docs.python.org/library/sys.html#sys.settrace。
3
每次发生性能分析事件时,profiler
函数都会被调用,因为你对它使用了 sys.setprofile
。
每次被调用时,它都会打印一行内容,因为你在它的主体里放了一个无条件的 print
语句。至于你为什么这样做,我们很难告诉你,这让你的“为什么”问题变得非常奇怪。
性能分析事件其实就是一些函数的调用和返回,具体来说,参考文档:
'call'
一个函数被调用(或者进入了其他代码块)。
'return'
一个函数(或其他代码块)即将返回。
'c_call'
一个C语言函数即将被调用。这可能是一个扩展函数或内置函数。
'c_return'
一个C语言函数已经返回。
在我观察到的(Python 2.5 或 2.6,MacOSX)一个稍微简单明了的情况下:
>>> def a():
... print 'aaa'
...
>>> def profiler(frame, event, arg):
... print 'PROF %r %r' % (event, arg)
...
>>> sys.setprofile(profiler)
PROF 'return' None
>>> a()
PROF 'call' None
PROF 'c_call' <built-in function utf_8_decode>
PROF 'c_return' <built-in function utf_8_decode>
PROF 'return' (u'a()\n', 4)
PROF 'call' None
PROF 'call' None
aaa
PROF 'return' None
PROF 'return' None
不太确定你为什么没有看到 c_call
和 c_return
的情况,可能是因为在你的特定平台上打印时没有隐式的 utf-8
转换(你用的是什么操作系统?什么版本的Python?如果有的话,使用的是什么IDE)。