Последовательные вызовы cProfile / pstats не обновляются должным образом - PullRequest
1 голос
/ 22 февраля 2009

Я пытаюсь делать последовательные вызовы некоторого кода профилировщика, однако при втором вызове функции время обновления файла профиля изменяется, но фактическая статистика профилировщика остается прежней. Это не тот код, который я запускаю, но он настолько упрощен, что пример, который я могу придумать, демонстрирует то же поведение.

При запуске, при первом нажатии Ctrl + C он показывает статистику, во второй раз то же самое, но не полностью обновляется, как ожидалось, только время, и программа в третий раз фактически закрывается. Если вы пытаетесь, в идеале подождите несколько секунд между нажатиями Ctrl + C.

Добавление profiler.enable () после 8-й строки дает полное обновление между вызовами, однако добавляет много дополнительных данных профилировщика для вещей, которые я не хочу профилировать.

Какие-нибудь предложения для счастливой среды, где я получаю полные обновления, но без лишнего пуха?

import signal, sys, time, cProfile, pstats

call = 0

def sigint_handler(signal, frame):
global call
if call < 2:
    profiler.dump_stats("profile.prof")
    stats = pstats.Stats("profile.prof")
    stats.strip_dirs().sort_stats('cumulative').print_stats()
    call += 1
else:
    sys.exit()
def wait():
time.sleep(1)

def main_io_loop():
signal.signal(signal.SIGINT, sigint_handler)
while 1:
    wait()

profiler = cProfile.Profile()
profiler.runctx("main_io_loop()", globals(), locals())

1 Ответ

1 голос
/ 23 февраля 2009

Вызов profiler.dump_stats (реализован в cProfile.py) вызывает profiler.create_stats, который, в свою очередь, вызывает profiler.disable ().

Вам нужно вызвать profiler.enable (), чтобы он снова заработал. Нет, это не задокументировано.

Следующее, кажется, делает то, что вы хотите. Обратите внимание, что я избавился от промежуточного файла данных, так как pstats.Stats знает, как напрямую получать данные из профилировщика.

import signal, sys, time, pstats, cProfile

call = 0

def sigint_handler(signal, frame):
  global call
  if call < 2:
    stats = pstats.Stats(profiler)
    stats.strip_dirs().sort_stats('cumulative').print_stats()
    profiler.enable()
    call += 1
  else:
    sys.exit()

def wait():
  time.sleep(1)

def main_io_loop():
  signal.signal(signal.SIGINT, sigint_handler)
  while 1:
    wait()

profiler = cProfile.Profile()
profiler.runctx("main_io_loop()", globals(), locals())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...