Как сделать тайм-аут при профилировании кода с помощью cProfiler без изменения кода пользователя?

Часто во время моей работы я пишу код для чтения строк из файла и обрабатываю эти строки по одной за раз.

Иногда обработка строк усложняется, а файл длинный, например, сегодня для обработки 200 строк требуется примерно одна минута, а общее количество строк в файле составляет 175 КБ.

Я хочу выяснить, какая часть моего кода занимает много времени, и для этого я решил использовать cProfiler в Python.

Проблема в том, что я не могу на самом деле запустить весь код, потому что это займет слишком много времени, и если я прерву процесс на полпути через сигнал выхода, то я также умираю cProfiler, не создавая отчет и не модифицируя код с логикой, чтобы умереть после определенного времени. чтение только верхних K строк раздражает (потому что я склонен к такого рода вещам для разных типов данных в моей работе). Я хочу избегать добавления опций только для профилирования, если это возможно.

Каков самый чистый способ сказать cProfiler, что он будет работать в течение 3 минут, профилировать, что происходит, останавливаться и затем сообщать о своих результатах?

1 ответ

Решение

Шаг 1: запустите ваш скрипт myscript.py под профилировщиком в течение 3 минут, выводя данные профилирования в файл prof, На Linux и аналогичных, вы можете сделать это с

timeout -s INT 3m python -m cProfile -o prof myscript.py

(Примечание: если вы опустите -s INT, SIGTERM используется вместо SIGINT, который, кажется, работает на Python 2, но не на Python 3.) В качестве альтернативы, в любой системе вы должны быть в состоянии сделать

python -m cProfile -o prof myscript.py

затем нажмите Ctrl-C по истечении 3 минут.

Шаг 2: получить статистику от prof файл с чем-то вроде

python -c "import pstats; pstats.Stats('prof').sort_stats('time').print_stats(20)"
Другие вопросы по тегам