С примерами панды
Сценарист: Амаль Хасни и Диа Хмила
Как вы знаете, 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
:
Спасибо, что зашли так далеко. Берегите себя и до встречи в следующей истории 😊!
Другие статьи для чтения
Ваше руководство по плавному переходу с Pandas на Pyspark
Pandas vs PySpark 101towardsdatascience.com
Как легко объединить несколько блокнотов Jupyter в один
Проникновение в Jupytertowardsdatascience.com