Python中的setTrace()(redux)

时间:2009-10-21 14:31:24

标签: python trace

对于重新发布的道歉但我必须在工作时编辑这个问题,并意识到我需要有一个帐户才能这样做。所以这里又一次(带有更多的背景)。

我正在尝试计算脚本执行的时间,我想通过检查每行代码执行后经过的时间来做到这一点。我之前在脚本包含方法定义时已经这样做了,但我不确定它在这个实例中是如何工作的。

所以我的问题是:有没有办法在没有方法定义的脚本中使用setTrace()函数?即。

for i in range(1, 100):
    print i

def traceit(frame, event, arg):
    if event == "line":
        lineno = frame.f_lineno
        print "line", lineno

    return traceit

sys.settrace(traceit)

1 个答案:

答案 0 :(得分:2)

不,正如the docs所说,“每当输入新的本地范围时,都会调用跟踪函数(事件设置为'call')” - 如果你从未输入本地范围(并且只执行全局范围),永远不会调用跟踪函数。请注意,settrace无论如何都是为了定时“脚本执行多长时间”,因为它会改变它的测量值太多;如果你说的实际上是你想要的,只需花时间开始执行并注册atexit一个能够再次获得时间并打印差异的函数。如果您想要的不同,即分析,请参阅cProfile

进一步注意,你提供的代码示例可能无法做任何有用的事情(即使我已经编辑它来修复缩进错误):首先它循环,然后它定义一个函数,最后它调用settrace ...然后立即结束,因为之后没有更多的代码!如果你希望发生任何事情那个循环开始之前,并且你想要在模块顶层(不好主意,但是,无论如何)拥有一切,你必须在词汇之前放置“任何东西” 循环,而不是......; - )