НачатьНачать бесплатно

Использование %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

Посмотреть курс

Практическое интерактивное упражнение

Превратите теорию в практику с помощью одного из наших интерактивных упражнений

Начать упражнение