Использование %lprun: устраняем узкое место
В предыдущем упражнении вы профилировали функцию convert_units() и обнаружили, что генератор списка new_hts может быть потенциальным узким местом. Заметили ли вы, что генератор списка new_wts также занимает схожий процент времени выполнения? Это говорит о том, что для создания объектов new_hts и new_wts стоит использовать другой подход.
Поскольку рост и вес каждого героя хранятся в массиве numpy, для преобразования значений можно воспользоваться вещательными операциями над массивами вместо генераторов списков. Этот подход реализован в функции ниже:
def convert_units_broadcast(heroes, heights, weights):
# Array broadcasting instead of list comprehension
new_hts = heights * 0.39370
new_wts = weights * 2.20462
hero_data = {}
for i,hero in enumerate(heroes):
hero_data[hero] = (new_hts[i], new_wts[i])
return hero_data
Загрузите пакет line_profiler в вашу сессию IPython. Затем используйте %lprun для профилирования функции convert_units_broadcast() на данных о супергероях. Функция convert_units_broadcast(), список heroes, массивы hts и wts уже загружены в вашу сессию. Выполнив код, ответьте на вопрос:
Какой процент времени занимает строка кода с вещательным вычислением массива new_hts относительно общего времени выполнения функции convert_units_broadcast()?
Это упражнение является частью курса
Эффективный код на Python
Практическое интерактивное упражнение
Превратите теорию в практику с помощью одного из наших интерактивных упражнений
Начать упражнение