С примерами панды

Сценарист: Амаль Хасни и Диа Хмила

Как вы знаете, Python — это интерпретируемый язык. Это означает, что код Python не компилируется напрямую в машинный код, а интерпретируется в режиме реального времени другой программой, называемой интерпретатором (в большинстве случаев cpython ).

Это одна из причин, почему python обеспечивает такую ​​большую гибкость (динамическая типизация, работает везде и т. д.) по сравнению с компилируемыми языками. Однако именно поэтому python ужасно медленный.

Решения для медленного python

На самом деле есть несколько решений медлительности Python:

  • используйте cython: язык программирования, являющийся надмножеством Python
  • используйте язык C/C++ в сочетании с ctypes , pybind11 или CFFI для написания привязок Python
  • расширить Python с помощью C/C++
  • использовать другие скомпилированные языки, такие как rust

Как видите, все эти методы требуют использования языка, отличного от python, и компиляции кода для его работы с python.

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

Numba и JIT-компиляция

Встречайте numba пакет Python, который значительно ускорит ваш код, не отказываясь от удобства Python:

Numba — это JIT-компилятор с открытым исходным кодом, который переводит подмножество кода Python и NumPy в быстрый машинный код.

numba использует компиляцию Just-in-time (JIT) (что означает, что она компилируется во время выполнения кода Python, а не до этого), и, прежде чем вы спросите, нет, вам даже не нужно иметь установлен компилятор C/C++. Все, что вам нужно сделать, это установить его с помощью pip/conda:

pip install numba

Мы достаточно поговорили, давайте попробуем пример (из документации from numba). Мы хотим вычислить оценку π с помощью симуляции Монте-Карло:

Обратите внимание, что при использовании numba нам просто нужно импортировать декоратор ( njit), и он сделает все остальное.

Выполнение этого кода для определения времени двух версий показывает, что numba в 30 раз быстрее обычного python:

Некоторые предостережения

В таком виде numba звучит слишком хорошо, чтобы быть правдой. Но у него наверняка есть свои недостатки:

  • Накладные расходы связаны с первым запуском декорированной функции numba. Это связано с тем, что numba попытается выяснить типы параметров и скомпилировать функцию при первом ее выполнении. Поэтому при первом запуске он будет немного медленнее.
  • Не весь код на Python будет скомпилирован с numba , например, если вы используете смешанные типы для одной и той же переменной или для элементов списка, вы получите ошибку.

Панды на стероидах

numba создан специально с учетом numpy и очень удобен для массивов numpy. Вы знаете, что еще построено на numpy ?
Вы уже догадались: pandas . Это приводит к сумасшедшей оптимизации при использовании пользовательских функций или даже при выполнении различных операций Dataframe.

Давайте посмотрим несколько примеров, начиная с этого DataFrame:

Пользовательские функции

Другой метод numba is vectorize , который упрощает создание универсальных функций numpy (ufuncs).

Простой пример — вычисление квадрата столбца высоты в нашем наборе данных:

Основные операции

Другой пример (using njit ) заключается в вычислении ИМТ (индекса массы тела) с использованием следующего кода:

Вы можете видеть, что даже для базовых операций numba по-прежнему занимает меньше времени, чем необработанные панды с (6,77 мс против 8,63 мс)

Последние мысли

Использование numba — это очень простой способ сделать ваш код намного быстрее без особых усилий. Иногда может потребоваться несколько попыток, прежде чем ваш код будет успешно скомпилирован, но в целом он будет работать из коробки.

Если вас интересуют другие способы сделать панд быстрее, ознакомьтесь с нашей статьей about eval & query :



Спасибо, что зашли так далеко. Берегите себя и до встречи в следующей истории 😊!

Другие статьи для чтения