Рубрики
Без рубрики

Python 102: как профилировать код

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Профилирование кода – это попытка найти узкие места в вашем коде. Профилирование предполагается найти, какие части вашего кода занимают самое длинное. Как только вы знаете это, вы можете посмотреть на эти кусочки вашего кода и попытаться найти способы оптимизации его. Python поставляется с тремя профилировщиками, встроенными в: CPROFILE , Профиль и Hotshot Отказ Согласно документации Python, Hotshot «Больше не поддерживается и может быть сброшен в будущей версии Python». Профиль Модуль – это чистый модуль Python, но добавляет много накладных в профилированные программы. Таким образом, мы будем сосредоточиться на CPROFILE , который имеет интерфейс, который имитирует модуль профиля.

Профилирует ваш код с cprofile

Профилирующий код с CPROFIL действительно довольно легко. Все, что вам нужно сделать, это импортировать модуль и позвонить в его Беги функция. Давайте посмотрим на простой пример:

Здесь мы импортируем Hashlib Модуль и используйте CPROFIL для профиля создания хеша MD5. Первая строка показывает, что было 4 функциональных вызовов. Следующая строка говорит нам о том, как приведены результаты. Согласно документации, стандартное имя Относится к дальнему правой колонке. Здесь есть несколько столбцов.

  • NCalls это количество вызовов.
  • Tottime в целом времени, проведенного в данной функции.
  • Percall Относится к ценному количеству Tottime, разделенным на NCalls
  • CumTime Совокупное время, проведенное в этом и все подфункции. Это даже точно для рекурсивных функций!
  • Второй Percall Column является частным количеством накопленного времени, разделенного примитивными звонками
  • Имя имена: Lineno (Функция) Предоставляет соответствующие данные каждой функции

Примитивный вызов – это тот, который не был индуцирован через рекурсию.

Это не очень интересный пример, так как нет очевидных узких мест. Давайте создадим кусок кода с некоторыми встроенными узкими местами и посмотреть, обнаруживает ли их профилировщик.

В этом примере мы создаем четыре функции. Первые три бега по разным ставкам. быстро функция будет работать с нормальной скоростью; Средний Функция займет около половины секунды, чтобы запустить и медленно Функция займет около 3 секунд. Главная Функция вызывает еще три. Теперь давайте запустим CPROFIL против этой глупой небольшой программы:

На этот раз мы видим, что программа заняла 3,5 секунды. Если вы осмотрите результаты, вы увидите, что CPROFIL определил медленно Функция, как бежать 3 секунды. Это самое большое узкое место после Главная функция. Обычно, когда вы найдете узкое место, как это, вы бы попытались найти более быстрый способ выполнить свой код или, возможно, решить, что время выполнения было приемлемым. В этом примере мы знаем, что лучший способ ускорить функцию – удалить Time.sleep Вызов или, по крайней мере, уменьшите длину сна.

Вы также можете вызвать CPROFIL в командной строке, а не использовать ее в переводчике. Вот один из способов сделать это:

Это запускает Cprofile против вашего сценария так же, как и раньше. Но что, если вы хотите сохранить выход профилирования? Ну, это легко с Cprofile! Все, что вам нужно сделать, это передать это -O Команда, за которой следует имя (или путь) выходного файла. Вот пример:

К сожалению, файл, который он выводит не совсем читабелен. Если вы хотите прочитать файл, то вам нужно использовать Python’s PSTATS модуль. Вы можете использовать PSTATS для форматирования вывода различными способами. Вот какой-то код, который показывает, как получить какой-то вывод, который похоже на то, что мы видели до сих пор:

strip_dirs Вызов раскроет все пути к модулям с вывода во время sort_stats Вызов делает сортировку, которую мы привыкли видеть. В документации Cprofile есть куча действительно интересных примеров, показывающих различные способы извлечения информации, используя модуль PSTATS.

Упаковка

На этом этапе вы должны быть в состоянии использовать модуль Cprofile, чтобы помочь вам диагностировать, почему ваш код такой медленный. Вы также можете взглянуть на Python’s Время течения модуль. Это позволяет вам времявать небольшие кусочки вашего кода, если вы не хотите иметь дело с сложностями, связанными с профилированием. Есть также несколько других трехсторонних модулей, которые полезны для профилирования, такие как Line_Profiler и memory_profiler проекты.

Связанное чтение