Автоматизация, Программирование

Однострочная многократная оптимизация кода на Python с использованием Numba

Время прочтения: 3 мин.

Часто для повседневных задач приходится писать несложные скрипты, которые обрабатывают массивы из excel таблиц, выгрузки из баз данных и из прочих источников информации. Подобные программы удобно на языке python и используются они достаточно локально — на паре-тройке машин.

Поэтому программисту, пишущему такой скрипт, обычно нет необходимости сильно углубляться в оптимизацию написанного им кода, так как сильной полезности компании этого не принесёт.

Так как же повысить производительность кода, внеся только несколько изменений? Ответом в данной ситуации послужит Numba!

Используя лишь несколько простейших декораторов, библиотека Numba генерирует оптимизированный машинный код с использованием компилятора LLVM таким образом, что он становится сравним по скорости с тем же кодом, написанным на C/C++ или Fortran.

Вот как компилирует код Numba:

Ссылка на github

Numba была задумана для работы с числовыми значениями и массивами Numpy. Функции и даже классы могут быть оптимизированы в двух режимах — ‘nopython’ и ‘object’. В первом случае — получается достигнуть наибольшего выигрыша в производительности за счёт компиляции функции напрямую в машинный код. Во втором случае — мы имеем ситуацию, когда Numba имеет дело с оптимизацией циклов и прочих конструкций, а остальной код продолжает исполняться интерпритатором. Режим ‘object’ необходим, так как, к сожалению, с некоторыми объектами Python, например словарём (dict), Numba не способен провести оптимизацию.

Пример оптимизации кода с использованием Numba:

В приведённом примере использование Numba дало двухкратный выигрыш в производительности.

В ряде случаев возможен намного более серьёзный прирост в скорости:

В данном примере уже был получен выигрыш в 290 раз!

Numba в большинстве случаев самостоятельно выводит тип входных параметров и выходных значений, однако для лучшего контроля за целостностью кода возможно явно указать типы всех параметров:

Таким образом, при незаметных усилиях можно достаточно сильно улучшить производительность собственного кода. Лучшей практикой при использовании технологии Numba будет изначально писать программный код разбитым на небольшие целостные функции без внешних зависимостей.

Numba представляет намного больше возможностей для улучшения кода, чем описаны в данной статье, в том числе компиляция кода по вычислениям на GPU, что является крайне большим подспорьем для внедрения её не только в малые, но и крупные проекты.

Советуем почитать