setTrace () в Python (избыточный) - PullRequest
       6

setTrace () в Python (избыточный)

1 голос
/ 21 октября 2009

Извиняюсь за перепост, но мне пришлось редактировать этот вопрос, когда я приступил к работе и понял, что мне нужна учетная запись для этого. Итак, здесь это снова (немного больше контекста).

Я пытаюсь определить время, необходимое для выполнения скрипта, и я думаю об этом, проверяя прошедшее время после выполнения каждой строки кода. Я делал это раньше, когда скрипт содержал определения методов, но не уверен, как он будет работать в этом случае.

Итак, мой вопрос: есть ли способ использовать функцию 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 Ответ

2 голосов
/ 21 октября 2009

Нет, поскольку документы говорят: «Функция трассировки вызывается (с событием, установленным на« вызов ») всякий раз, когда вводится новая локальная область» - если вы никогда не вводите локальную область (и выполняется только в глобальной области), функция трассировки никогда не будет вызываться. Обратите внимание, что settrace в любом случае слишком инвазивен с целью определения времени «сколько времени занимает выполнение скрипта», так как это изменит то, что он измеряет слишком много; если то, что вы говорите, на самом деле то, что вы хотите, просто возьмите время в начале выполнения и зарегистрируйте в atexit функцию, которая снова получает время и печатает разницу. Если то, что вы хотите, отличается, то есть профилирование , см. cProfile .

Также обратите внимание, что пример кода, который вы даете, не может ничего сделать полезного (хотя я редактировал его, чтобы исправить ошибку отступа): сначала он зацикливается, затем он определяет функцию, наконец, она вызывает settrace ... затем сразу заканчивается, потому что после этого больше нет кода! Если вы хотите, чтобы что-то произошло за до запуска этого цикла, и вы хотите, чтобы все было на верхнем уровне модуля (плохая идея, но, что угодно), вы должны поместить "что-нибудь" в лексическом порядке перед цикл, а не после ...; -)

...