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

Довольно часто при анализе данных и в процессе машинного обучения программисты прибегают к использованию небезызвестного Python модуля pandas. Можно сказать, что это незаменимый инструмент при работе с большими массивами данных. И хотя pandas сам по себе имеет довольно высокое быстродействие, кому-то, возможно, этого будет недостаточно. Как же ускорить работу при его использовании?

Оказывается, что решение в этом вопросе есть, и имя его – modin. Modin – это модуль python, по сути обёртка, которая позволяет ускорить скрипты pandas за счёт параллельных вычислений. Что не менее приятно – нет необходимости переписывать уже существующий код, достаточно изменить лишь одну строчку.

Но первое, что необходимо сделать – конечно же установить модуль. Следует обратить внимание, что установка осуществляется в два этапа. Сначала по команде pip install устанавливаем сам модуль:

pip install –U modin

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

pip install modin[dask]

Здесь мы производим установку движка dask, благодаря которому modin и становится полностью рабочим и за счёт которого происходит ускорение. Существует также движок ray, но, в отличие от dask, он не работает на windows.

Теперь мы готовы к работе. Как было сказано выше, для использования modin в целях ускорения не нужно переписывать код, и это действительно так. Например, строка импорта pandas выглядела следующим образом:

import pandas as pd

Меняем pandas на modin.pandas и теперь мы можем использовать весь функционал pandas, работая с его стандартным API (чтение файлов read_*fileformat, DataFrame, Series):

import modin.pandas as pd

Сравним скорость работы стандартного pandas и modin pandas. Для этого мы будем загружать несколько csv-файлов разных размеров и вычислять затраченное время с помощью модуля datetime. Структура используемого кода далее:

import time 
import datetime
import pandas as pd
import modin.pandas as mpd
import numpy as np

t1 = datetime.datetime.now()
df = pd.read_csv(r'table.csv')
t2 = datetime.datetime.now()
dt = t2 - t1
print(dt.total_seconds())

При тестировании modin используем mpd.read_csv(). Скорость чтения достаточно небольшого файла размером 35 Мб различается незначительно. После 100 итераций для pandas на тестируемом компьютере среднее время составило 2.8 секунд, а для modin pandas – 2.5 секунды. С увеличением размеров файла до 243 Мб время чтения для pandas и modin pandas составило соответственно 10.4 и 7.3 секунды, а для файла размером 382 Мб – 15.2 и 9.27 секунд соответственно. Ускорение заметно более явно при увеличении размеров датасета.

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

arr = np.random.sample((500000, 50))
t1 = datetime.datetime.now()
arr_df = pd.DataFrame(arr)
arr_df *= 10
t2 = datetime.datetime.now()
dt = t2 - t1
print(dt.total_seconds())

Была сформирована матрица из 500 тысяч строк и 50 столбцов, заполненная рандомными значениями, затем создан объект DataFrame и каждый элемент этого объекта умножен на константу, в данном случае 10. Само по себе создание объекта DataFrame что при использовании «чистого» pandas, что при использовании modin pandas происходит очень быстро — время dt в обоих случая было настолько мало, что выводилось значение 0.0 секунд. При добавлении операции умножения время, затраченное pandas, составило 0.161 секунды, а modin pandas – 0.104 секунды.

Можно сделать вывод, что при работе с файлами небольших размеров и небольшом количестве операций над датафреймами, наверное, нет большой необходимости в использовании modin, потому что выигранное время скорее всего не сделает погоды. Но если же у вас есть длинный код, который вы не хотите редактировать, и который производит серьёзную обработку датафреймов, с большим количеством операций, и имеет место чтение, например, csv-файлов больших размеров, стоит воспользоваться функционалом modin.

Спасибо за внимание!