Как сделать тайм-аут при профилировании кода с помощью 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)"