Как Scalene с ИИ-рекомендациями оптимизирует код Python

Как правило, Python негласно используется с библиотеками, написанными на других языках. При таком уровне абстракции бывает сложно понять, как улучшить производительность и потребление памяти. Однако подобные проблемы решаются с помощью профилировщика (англ. profiler). 

Этот инструмент выявляет участки кода, требующие наибольших затрат времени и памяти. Scalene  —  отличный профилировщик Python, который целенаправленно занимается CPU, GPU и памятью. В сочетании с ИИ-рекомендациями он помогает быстрее выполнять рефакторинг проблемных участков кода для повышения производительности. 

Применение Scalene

Scalene запускается командой scalene program_name.py. По умолчанию он проводит профилирование CPU, GPU и памяти. Для выбора одного или нескольких вариантов из предложенных применяются флаги: --cpu, --gpu и --memory. Например, scalene --cpu --gpu program_name.py профилирует только CPU и GPU.

Scalene обеспечивает профилирование как на уровне строк, так и функций. Для каждого из этих типов профилирования выделяется отдельный раздел выходной таблицы. Первый раздел включает профилирование всех строк, а второй  —  всех функций. Для профилирования только часто используемых строк и функций добавляется флаг --reduced-profile.

Интерфейсы 

После выполнения команды профилирования результаты отображаются в интерфейсе. Предлагаются два варианта интерфейса: интерфейс командной строки (CLI) и веб-интерфейс. Сравним их на примере следующего файла Python test.py:

size = 1000000

# Большое выделение памяти
x = [i for i in range(size)]
y = [i for i in range(size)]

# Большое время вычисления
for i in range(size):
y[i] = y[i] * y[i]

Интерфейс командной строки 

По умолчанию команда scalene test.py открывает веб-интерфейс. Для применения CLI добавляется флаг --cli:

В таблице представлены три цвета: синий, зеленый и желтый. Синий обозначает профилирование CPU, зеленый  —  памяти, желтый  —  GPU и объема копирования. 

Профилирование CPU показывает время, затраченное на выполнение кода Python, нативного кода (например, C или C++) и времязатраты на систему (например, I/O). В обозначенном примере 45% общего времени работы приходится на код Python в строке y[i] = y[i] * y[i]. Таким образом, это одна из строк, которая подлежит оптимизации для повышения производительности. При суммировании всех процентов в колонках синего цвета получается 100%. 

Профилирование памяти предоставляет информацию о процентном количестве памяти, выделяемой кодом Python. Таблица также отображает потребление памяти во времени и его максимальное значение. Как и ожидалось, создание векторов x и y приводит к наибольшему выделению памяти. Для повышения производительности следует создавать их посредством более оптимальных функций. 

Профилирование GPU и объема копирования показывает время работы GPU и соответственно объем копирования (мб/с). Объем копирования включает копии между GPU и CPU. Обратите внимание, что профилирование GPU поддерживает только NVIDIA GPU. 

Веб-интерфейс 

Веб-интерфейс похож на CLI. Однако в нем некоторые столбцы совмещены, и полученные результаты отображаются в виде шкалы с разными цветовыми оттенками. Например, для профилирования CPU выделяется только один синий столбец, в котором разными оттенками представлено время работы Python, нативного кода и системы. 

Для профилирования памяти и GPU предоставляются дополнительные столбцы: Memorу average, Мemory activity и GPU memory. Memorу average показывает среднее потребление памяти. Мemory activity отображает память, выделяемую Python и нативным кодом, показатели которых обозначаются двумя разными оттенками зеленого цвета. GPU memory указывает на использование памяти GPU.

В отличие от CLI создаются дополнительные файлы с именами profile.html и profile.json, которые содержат отображаемые результаты. Для получения таких файлов в CLI применяются флаги --json и --html .

ИИ-рекомендации

Рассмотренные в предыдущих разделах инструменты помогают определять строки и функции, требующие улучшения. Вместо того чтобы самим разрабатывать варианты оптимизации, вы можете ускорить рабочий процесс за счет генерации ИИ-рекомендаций. К счастью, предоставляется возможность совместного взаимодействия Scalene и OpenAI при наличии ключа API. 

Для получения ключа API создаем или входим в имеющийся аккаунт OpenAI. Далее в правом верхнем углу экрана нажимаем Personal и выбираем View API keys. На этой странице генерируем новый ключ API и копируем его в веб-интерфейс Scalene в раздел advanced options:

Вы можете выбирать из двух предлагаемых типов рекомендаций. Значок взрыва 💥 предусматривает варианты оптимизации для всего участка кода, а значок молнии  —  только для строки. Ниже приведен пример рекомендаций со знаком для test.py, которые в основном включают замены с использованием NumPy: 

4.

# Предлагаемая оптимизация:

# Векторизованные операции позволяют значительно ускорить создание списков.

# Здесь задействуется встроенная библиотека NumPy для создания массива чисел от 0 до size (особого размера) в одной строке.

5.

# Предлагаемая оптимизация: Векторизованная операция с NumPy.

# Векторизованная операция заменяет исходное списковое включение.

9.

# Предлагаемая оптимизация: Векторизованные операции для извлечения преимуществ NumPy.

# Преобразование списка в массив NumPy.

# Векторизованная операция для удвоения всех элементов в y.

После оптимизации версия test.py выглядит следующим образом: 

import numpy as np

size = 1000000

x = np.arange(size)
y = np.arange(size)

y = y ** 2

Полезные ресурсы

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Dora Lourenço, MSc: Optimize Python Code With Scalene and AI Suggestions

Предыдущая статья10 ключевых команд Docker в арсенал фронтенд-разработчиков
Следующая статья5 советов по оптимизации производительности приложения NodeJS