Профилирование программ / Хабр
Профилирование позволяет оценить время, затрачиваемое на выполнение отдельных операций в программе. Профилирование можно выполнять как для всего кода, так и для его фрагментов.
Для начала рассмотрим профилирование фрагментов кода.
В случае работы в Jupyter notebook можно использовать так называемые “магические команды”. Для того, чтобы узнать время выполнения одной строки, нужно в её начале разместить магическую команду %time. В приведенном ниже примере в последней ячейке тетрадки создается матрица размером 10000×10000, заполненная случайными вещественными числами
Как видно, на это потребовалось 1,27 секунды. Отметим, что повторный запуск аналогичной команды потребовал уже 1,63 секунды.
Чтобы оценить время выполнения кода в каждой из строк какой-либо ячейки, необходимо использовать магическую команду %time в каждой строке. В приведенном ниже примере создаются и перемножаются две матрицы размером 5000×5000, заполненные случайными вещественными числами.
Если же нужно оценить время выполнения ячейки в целом, необходимо использовать команду %%time. Генерация двух матриц и их перемножение потребовали в сумме 4,7 секунды.
Описанные приемы позволяют получить лишь начальное представление о быстродействии кода. Как известно, единичного эксперимента недостаточно для того, чтобы составить адекватное представление о поведении исследуемой системы. Проведем серию экспериментов и возьмем среднее значение в качестве оценки времени выполнения кода. Для этого будем использовать команду %%timeit с ключом -r, задающим количество вычислительных экспериментов.
В следующем примере мы так же генерируем и перемножаем две матрицы в серии из пяти экспериментов.
Как видно, среднее значение времени в серии экспериментов (5,37 секунды) отличается от времени единичного эксперимента, проведенного ранее (4,7 секунды).
Рассмотрим еще один пример профилирования кода.
В некоторых случаях имеет смысл сравнить несколько возможных вариантов реализации кода, чтобы выбрать из них наиболее производительный.
Известно, что значение функции “синус” для значений аргумента, близких к нулю, можно представить в виде суммы ряда Маклорена, а приближенное значение вычислить как сумму его первых двух слагаемых.
Исследуем два способа вычисления приближенного значения синуса, отличающихся способом вычисления второго слагаемого: в одном случае через трехкратное перемножение аргумента, в другом — через операцию возведения в степень. Для измерения времени снова воспользуемся командой timeit.
Несмотря на то, что математически эти варианты полностью эквивалентны, вариант с расчетом через перемножение аргументов приблизительно в три раза быстрее варианта с возведением в степень. Этот результат был бы совершенно не очевиден без профилирования.
Перейдем к профилированию кода программы в целом.
Представим, что есть программа min_distance_naive. py, вычисляющая наименьшее расстояние между точками на плоскости и началом координат. Координаты точек представлены матрицей размерности 1000000×2, записанной в файле points.npy. Ключевой фрагмент кода — функция min_dist_naive.
import numpy as np def min_dist_naive(points, base): r_min = float('inf') for p in points: r = ((p[0] - base[0]) ** 2 + (p[1] - base[1]) ** 2) ** (1 / 2) r_min = min(r, r_min) return r_min points = np.load('points.npy') origin = (0, 0) min_dist = min_dist_naive(points, origin) print(min_dist)
Для запуска этой программы необходимо в командной строке выполнить следующую команду:
python min_distance_naive.py
Для запуска профилирования дополним эту команду ключом -m cProfile указывающим, что для профилирования нужно использовать модуль cPython, и ключом -s time, указывающим, что результаты профилирования нужно упорядочить по времени.
python -m cPython -s time min_distance_naive. py > naive.txt
Весь вывод, в том числе результаты профилирования, будут записаны в текстовый файл naive.txt. Анализ этого файла показывает, что время выполнения программы составило 4,369 с., суммарное время выполнения функции поиска минимального расстояния составило 4,132 с.
Теперь попробуем ускорить выполнение кода. Поскольку алгоритм решения задачи построен вокруг сравнения между собой большого количества расстояний, то, принимая во внимание монотонность функции извлечения квадратного корня, можно исключить эту функцию и сравнивать между собой квадраты расстояний. В соответствии с этой идеей несколько доработаем исходную функцию, исключив из цикла операцию извлечения квадратного корня.
import numpy as np def min_dist_optim(points, base): r_min = float('inf') for p in points: r = (p[0] - base[0]) ** 2 + (p[1] - base[1]) ** 2 r_min = min(r, r_min) r_min = r_min ** (1 / 2) return r_min points = np.load('points.npy') origin = (0, 0) min_dist = min_dist_optim(points, origin) print(min_dist)
Запустим профилирование доработанной программы.
python -m cPython -s time min_distance_optimized.py > optimized.txt
Обратимся к результатам профилирования.
В этом случае время выполнения функции составило 3,772 с.
По результатам многократного профилирования обоих вариантов и статистической обработки полученных экспериментальных данных, включающей в том числе сравнение выборок с помощью t-критерия Уэлча, получен статистически значимый результат, свидетельствующий о том, что модифицированная функция приблизительно на 8% быстрее исходной. Таким образом, профилирование помогает выявить узкие места в коде с точки зрения производительности, сравнить разные варианты реализации алгоритмов, и в конечном счете ускорить выполнение программ. Код приведенных примеров, а также экспериментальные данные можно найти в репозитории.
Как профилирование помогает руководителю развивать бизнес — Карьера на vc.ru
Профилирование персонала – необходимый руководителю инструмент для успешного движения компании в бушующем океане бизнеса.
1275 просмотров
Из чего же, из чего же, из чего же…
Профиль сотрудника строится на основе достаточно широкого набора данных, которые можно собрать на основании действий сотрудника за рабочим компьютером, фиксируемых в реальном времени. Это, например, статистика по используемым на рабочем ПК приложениям и посещаемым веб-ресурсам. Или такие параметры, как фактическое время начала и окончания рабочего дня, переработки сотрудника, активность в выходные дни. Эти данные по одному сотруднику с очень приблизительной точностью можно постараться собрать и вручную. Но если речь о большой компании и хочется получить не приблизительные, а точные данные, здесь не обойтись без аналитической системы.
Собрав всю эту информацию, можно наложить друг на друга профили всех сотрудников, которые работают в одной должности. На пересечении этих множеств сформируется профиль должности типичного маркетолога/пиарщика/разработчика и любого другого специалиста.
Затем на профили должности руководитель накладывает оценку эффективности: он оценивает, насколько его подчиненные результативны, насколько качественно и в срок выполняют свои задачи. Очевидно, среди персонала его подразделения будут сотрудники, чьи профили сильно отличаются от стандартного профиля той или иной должности. Причем отличия эти будут как со знаком «плюс» — очень эффективный сотрудник, так и со знаком «минус» — отстающий в эффективности работник. Анализ активности преуспевающих специалистов покажет, что именно (какие инструменты, знания, навыки) помогает им быть столь эффективными, и, наоборот, анализ активности отстающих поможет выявить слабые места и подтянуть их.
Если у вас в распоряжении есть аналитическая система, можно научить ее получать объективные данные об эффективности сотрудников из разнообразных систем оценки персонала, например, из результатов широко распространенной системы оценки «360 градусов».
Основой профилирования является сбор статистических данных – скользящего среднего (усредненной суммы) с некоторым историческим окном: например, 1 раз в неделю или в три недели в зависимости от собираемых показателей. Так, среднесуточное рабочее время сотрудника целесообразно рассчитывать за период 7 дней, а набор характерных для должности приложений – за 3 недели, так как они не так часто меняются. Затем вычисляется расхождение между средним профилем должности и профилями всех сотрудников, занимающих аналогичную должность. При этом средний профиль рассчитывается как медиана – середина отсортированных по возрастанию данных, делящая их на две равные части.
Если сотрудник, занимающий конкретную должность, сильно отклоняется от среднего профиля этой должности, значит, он либо неэффективен (занимается не тем, чем должен, не имеет нужных знаний, мотивации и т.п.), либо он, наоборот, очень успешен – суперэффективный лидер, до которого надо подтягивать окружающих.
Подобные принципы и подходы сбора и анализа больших данных уже на протяжении 5 лет используются различными разработчиками программного обеспечения в области информационной безопасности. В этой сфере накоплены огромные наработки, проверенные временем и крупными российскими предприятиями самых разных отраслей. Теперь этот опыт можно и нужно применять для решения бизнес и HR-задач.
Профилирование для HR и линейных руководителей
Итак, у нас есть профили должностей, а также профили ряда сотрудников, которые так или иначе ему не соответствуют, – лидеров и отстающих. Что нам это дает? Начнем с тех задач, которые стоят перед линейными руководителями и HR-департаментом и которые могут быть решены за счет профилирования.
Эта задача решается в двух направлениях. С одной стороны, профилирование позволяет выявить неэффективных, отстающих сотрудников и довести их уровень до усредненного профиля должности.
С другой стороны, анализ профиля наиболее эффективного сотрудника помогает понять, что же дает ему прирост эффективности при решении задач в сравнении с другими сотрудниками в одной должности. Аналитика по этим двум направлениям дает руководителю понимание, какие действия нужно предпринять для того, чтобы повысить эффективность отстающих сотрудников, а также всех сотрудников подразделения до профиля лидера. Например, применить в подразделении какие-то новые, недавно появившиеся методики и подходы в решении задач. Или провести дополнительное обучение, чтобы сотрудники получили новые знания или освоили какие-то передовые инструменты работы, компьютерные программы и т.п. Профиль лидера дает руководителю целевую картинку: что всем остальным нужно улучшить, скорректировать, чтобы всё подразделение соответствовало этому целевому профилю.
- Профессиональное развитие сотрудников
Если сравнивать профиль конкретного отстающего сотрудника с профилем самого эффективного сотрудника, мы можем понять, в чем между ними разница и чего не хватает отстающему. На основе этих знаний можно составить индивидуальный план развития отстающего сотрудника, например назначить какие-либо курсы повышения квалификации и т. д. В таком случае профессиональное обучение будет таргетированным, а не по принципу: вот набор курсов для всех, проходите.
Вполне понятно стремление HR-департамента развивать сотрудников. Но если компания большая, то очень сложно понять, кому реально нужно то или иное обучение. А благодаря профилю сотрудника можно увидеть, какие навыки являются для него ключевыми, какие рабочие инструменты он использует. И тогда мы сможем предложить этому сотруднику не все подряд, а релевантные учебные курсы.
Эту аналитику можно дополнить информацией о том, что человек ищет в интернете, и у нас будет понимание, чего ему не хватает. Допустим, мы видим, что сотрудник регулярно пользуется Microsoft Excel, а в поисковых запросах у него фразы вроде «как применить такую-то формулу», «как сделать то-то в экселе» и т. д. Значит, работник явно ощущает нехватку знаний – нужно организовать для него обучение по Microsoft Excel.
- Формирование кадрового резерва
Профиль лидера применим для определения круга сотрудников, которые могут претендовать в будущем на руководящие должности. Как и в случае с задачей по повышению эффективности, для этого сравнивают профили сотрудников с целевым и определяют, кто претендует на попадание в кадровый резерв, кому чего-то не хватает для включения в него, какие у кого зоны роста. И затем можно составить планы индивидуального развития для перспективных сотрудников.
Эти две задачи идут бок о бок, потому что очень часто бывают ситуации, когда первое в итоге приводит ко второму. Аналитическая система может отслеживать подобные тенденции в профиле сотрудника. Например, раньше его рабочий день примерно совпадал с официальным рабочим временем в компании, и вдруг начались регулярные переработки, работа по ночам. Если руководитель знает, что это не временная история, что речь не идет о каком-то большом проекте, который нужно скоро сдавать, то это первый тревожный сигнал. Если не разобраться в проблеме, переработки будут продолжаться и риск выгорания сотрудника станет весьма высоким.
Бывает обратная ситуация. Допустим, профиль нормального поведения сотрудника – это регулярные переработки: человек живет работой. И вот профиль начинает меняться: значительно уменьшилось количество коммуникаций, рабочий день стал четко привязанным к стандартному графику. И это уже совсем тревожный сигнал: вероятно, у сотрудника уже случилось профессиональное выгорание.
Другая возможная причина таких изменений – желание сотрудника сменить место работы. Возможно, человек уже для себя принял решение – это называется внутреннее увольнение, о котором он пока не сообщил работодателю, но, по сути, уже дорабатывает последние недели-месяц в компании. Профиль сотрудника в аналитической системе покажет руководителю, что процесс запущен. И это дает руководителю шанс предпринять шаги, чтобы удержать ценного специалиста в компании – предложить изменение финансовых условий, должностной позиции, рода занятий или предложить новый интересный проект и т.д.
Современные технологии анализа позволяют предотвращать как выгорание сотрудников, так и последующее увольнение. С их помощью руководитель увидит изменения в профилях подчиненных и сопоставит их с реальными задачами, которые выполняют работники. В любом виде деятельности, будь то маркетинг, управление проектами, бухгалтерия, продажи и многое другое, случаются проектные авралы, происходит сезонный рост нагрузки. Увидев подобные всплески в профиле своих сотрудников, руководитель понимает, что это временное и объяснимое явление. Но в случае систематической переработки, которая не вызвана объективными причинами, – это серьезный повод для руководителя задуматься, снять часть нагрузки с подчиненного, дать ему отпуск и принять другие меры, чтобы предотвратить выгорание.
Профилирование для топ-менеджмента
С точки зрения топ-менеджера профилирование – это один из инструментов организации труда на уровне компании. На основе профилей сотрудников можно увидеть картину по подразделениям в целом. Первая большая задача – это балансировка нагрузки между ними. Есть перегруженные подразделения, а есть недозагруженные, и без специальных инструментов, позволяющих проанализировать временные показатели загруженности, а также выявить с помощью профилирования сотрудников с низкой эффективностью, далеко не всегда очевидно, где одни, а где другие.
Вторая родственная задача – поиск резервов эффективности. С помощью профилирования топ-менеджер сможет понять, за счет каких внутренних резервов удастся повысить эффективность компании в целом. Например, есть ли возможность запустить новый проект без открытия новых вакансий? Эта задача решается с помощью профилирования сотрудников, когда мы выявляем среди них отстающих по объемам активности. За счет этих работников можно провести балансировку нагрузки. Они либо недозагружены и поэтому решают меньше рабочих задач, либо нуждаются в дополнительном обучении, чтобы быть более продуктивными. Это и есть тот самый резерв эффективности. Кроме того, с помощью профилирования мы можем выявлять дублирующие должности, когда сотрудники делают одно и то же. Это также возможности для оптимизации, нового распределения рабочих функций.
Еще одна задача на уровне топ-менеджмента – повышение эффективности руководящего состава. Подход здесь примерно такой же, как и при анализе обычных сотрудников, только сравниваются показатели менеджеров, выясняется, за счет чего одни эффективнее и чего не достает другим.
Перспективы профилирования
У профилирования в рамках автоматизированного анализа весьма широкие перспективы. Бурное развитие информационных технологий и постоянное появление новых электронных каналов коммуникаций – мессенджеров, соцмедиа и проч. – поставляет все новые и новые источники данных для формирования и анализа профилей сотрудников. Эти данные позволяют обогатить профиль работника, чтобы сделать анализ более точным, а организационные решения – более аргументированными.
При этом не стоит недооценивать информацию, получаемую даже из самых тривиальных, на первый взгляд, источников. Например, банальный календарь – очень интересный источник данных, который дает много ценной информации: количество встреч, сколько времени на совещаниях проводит конкретный сотрудник, они частые и короткие или редкие и затяжные и т. д. При этом все зависит от специфики разных должностей, привычек руководителей и многого другого. И все это тоже может влиять на эффективность и продуктивность сотрудника.
А еще не секрет, что успешный, эффективный работник сегодня – это не тот, кто как робот просто выполняет свою функцию. Часто эффективность решения производственных задач, качество решений, скорость их принятия зависят от так называемых гибких навыков (soft skills) сотрудника. Эти навыки также имеет смысл учитывать при построении профиля должности. Ведь способности человека многогранны, и если в процессе анализа упустить какую-то грань, то итоговая картина будет неполной. Только посмотрев на сотрудников под разными углами, можно получить полную картину происходящего в компании, увидеть свет на горизонте и достигнуть цели, минуя рифы и не разбившись о скалы.
Определениев кембриджском словаре английского языка
Как произносится профилирование ?
Переводы profiling
на китайский (традиционный)
罪犯特徵分析…
См. больше
на китайском (упрощенном)
罪犯特征分析…
Подробнее
Нужен переводчик?
Получите быстрый бесплатный перевод!
Обзор
профиль
изображение профиля
профилированный
профайлер
профилирование
выгода
отчет о прибылях и убытках
прибыль до вычета налога
центр прибыли
Проверьте свой словарный запас с помощью наших веселых викторин по картинкам
- {{randomImageQuizHook. copyright1}}
- {{randomImageQuizHook.copyright2}}
Авторы изображений
Пройди тест сейчасСлово дня
День независимости
ВеликобританияВаш браузер не поддерживает аудио HTML5
/ɪn.dɪˈpen.dəns ˌdeɪ/ НАСВаш браузер не поддерживает аудио HTML5
/ɪn.dɪˈpen.dəns ˌdeɪ/в США официальное название праздника Четвертого июля
Об этомБлог
Из одного дня в другой (Фразы со словом «день», часть 1)
Подробнее
Новые слова
супероблако
Больше новых слов
добавлен в список
Наверх
Содержание
EnglishBusinessTranslations
Что такое профилирование и как оно работает?
Садик Джаффер & Ричард Уорбертон
В этой записи блога мы рассмотрим профилирование производительности. Что это такое и как это работает. Это первая статья в нашей серии статей о профилировании в продакшене, к концу которой у вас будет понимание того, как работают профилировщики, какие из них безопасны и эффективны в продакшене, как читать и интерпретировать данные, которые они производят, и, наконец, , как использовать эти знания, чтобы оставаться на вершине производительности.
Итак, для начала, что такое профилирование? Профилирование — это измерение того, какие части вашего приложения потребляют конкретный интересующий вас вычислительный ресурс. Это может быть то, какие методы используют больше всего процессорного времени, какие строки выделяют больше всего объектов, откуда происходят промахи кэша вашего процессора и т. д.
Существует два основных способа реализации профилировщиков. Первый и самый ранний тип — инструментальные профилировщики. Они работают путем инструментирования тестируемой программы для сбора информации об интересующем ресурсе. Например, если вы хотите рассчитать, сколько времени требуется методам для выполнения, профилировщик инструментальных средств добавит инструкции в начало и конец каждого метода, чтобы зафиксировать текущее время, которое затем можно использовать для восстановления длительности, затраченной внутри каждого метода.
Проблема инструментальных профилировщиков заключается в том, что инструментальный код значительно изменяет поведение программы, а то, как это влияет на программу, зависит от ее структуры. Представьте себе две кодовые базы, выполняющие одну и ту же функциональность, но одна с растянутыми методами длиной в тысячу строк, а другая — с множеством более мелких методов. Для приведенного выше примера синхронизации метода влияние на первую кодовую базу будет значительно отличаться от воздействия на вторую, потому что для этого требуется выполнять значительно больше инструментального кода. Эта фундаментальная проблема делает инструментальные профилировщики неточными. Инструментальный код также имеет тенденцию сильно замедлять программу, что означает, что эти типы профилировщиков уже не так преобладают, как раньше.
Наиболее распространенным типом профилировщика является профайлер с выборкой . Они работают, периодически прерывая тестируемое приложение пропорционально потреблению интересующего нас ресурса. Пока программа прерывается, профилировщик делает снимок ее текущего состояния, который включает в себя, где в коде оно находится. После захвата состояния программа продолжается. В предыдущем примере с синхронизацией метода профилировщик выборки прервал бы программу по истечении определенного времени и зафиксировал ее состояние. Затем он собирал эти выборки с течением времени, чтобы получить статистическую картину состояния приложения. Вы можете использовать процент выборок, содержащих интересующий метод, чтобы рассчитать, сколько времени было потрачено на этот метод (но не продолжительность этого метода).
Выше приведен пример идеализированного профилировщика выборки. Черные прямоугольники представляют стек вызовов, блок выше вызывается блоком ниже, а зеленые линии указывают точки, в которых профилировщик прерывает и захватывает стек вызовов приложения. Наш первый пример будет в Server.handleRequest(), второй пример покажет, что мы находимся в конструкторе Customer со следующей трассировкой стека:
Customer() Customer.lookup() Заказ.получитьстатус() Сервер.handleRequest()
В отличие от инструментирования, профилирование с помощью выборки имеет две основные формы накладных расходов: частота, с которой мы останавливаем приложение, и стоимость остановки приложения вместе с записью его состояния. Оба они не зависят от фактической структуры приложения, которое мы тестируем, поэтому у нас нет той фундаментальной проблемы с точностью, которая была с инструментами.
У нас также есть некоторый контроль над частотой, с которой мы останавливаем приложение, поэтому мы можем выбрать уровень накладных расходов, который имеет профилировщик выборки. Очевидно, что если стоимость остановки приложения высока, нам нужна очень низкая частота дискретизации для поддержания низких накладных расходов, но с достаточно дешевым механизмом остановки приложения мы можем профилировать на высоких частотах с очень низкими накладными расходами.
Подводя итог тому, что вы рассказали в этом посте, можно сказать, что существует два основных типа профилировщиков: инструментальные и выборочные . Первый добавляет инструментарий для сбора данных, но при этом изменяет поведение приложения. _Выборка _ не меняет поведение приложения, а вместо этого дает статистическую агрегацию данных.