August 24, 2022

Грабли при работе с математикой в Python, за которые приходиться расплачиваться скоростью

В Python одни и те же действия можно осуществить с помощью разных методов, от чего будет напрямую зависеть скорость получения результата. Так, для математических операций предпочтение отдавайте специализированным библиотекам NumPy или Pandas перед встроенными возможностями.

Рассмотрим примеры обработки датафрейма двумя разными вариантами одной функции минимакс преобразования:

import numpy as np

def min_max_tr1(ar):    
    return (ar - np.min(ar))/(np.max(ar) - np.min(ar))

def min_max_tr2(ar):    
    return (ar - min(ar))/(max(ar) - min(ar))

ar = np.random.randint(100, size=(100000000))

В первом варианте используются NumPy функции, а во втором - их встроенные аналоги:

%%time
min_max_tr1(ar)
%%time
min_max_tr2(ar)

Видим, что способ с применением NumPy быстрее почти в 15 раз!
Отмечу, что если вы работаете с методами объектов NumPy или Pandas, то можно не переживать, так как специализированные способы обработки будут вызваны автоматически:

def min_max_tr3(ar):    
    return (ar - ar.min())/(ar.max() - ar.min())
%%time
min_max_tr3(ar)

Как можно убедиться, время выполнения примерно такое же, как если явно вызывать функции NumPy.

Кратное резюме - всегда используйте для математики с массивами данных библиотеки NumPy или Pandas. Если для игрушечных датасетов время исполнения не критично, то при работе с реальными данными кратное преимущество станет еще как заметным и избавит вас от лишней головной боли.