Получить доступ

Почему apply и циклы в pandas медленные и как писать быстрее?

MiddlePython и pandaspandas
Ещё спрашивают так:
  • Что такое векторизация в pandas?
  • Как обработать в pandas файл, который не помещается в память?
Коротко

Векторные операции над столбцами (df["a"] * df["b"], np.where, .str, .dt) выполняются в C над массивами. apply по строкам и циклы iterrows вызывают Python-функцию на каждую строку — медленнее в десятки–сотни раз. Для больших данных: правильные типы (category, int32), чтение частями (chunksize), колоночные форматы (Parquet) и движки Polars или DuckDB.

  • Условия — np.where, np.select, а не apply с if
  • category для строк с малым числом значений сокращает память в разы
  • Parquet читает только нужные столбцы и хранит типы

А ещё DuckDB позволяет запускать SQL прямо по Parquet и датафреймам

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Почему apply медленный. pandas хранит столбцы как массивы NumPy. Векторная операция — один вызов C-кода на весь столбец. apply(axis=1) создаёт объект строки и вызывает Python-функцию миллионы раз.

Приёмы ускорения:

  • арифметика, сравнения, np.where, np.select — вместо условий в apply;
  • методы .str и .dt для строк и дат;
  • merge со справочником вместо map с функцией;
  • groupby().transform вместо цикла по группам.

Большие данные:

  • типы: category, int32, float32, даты как datetime;
  • read_csv(chunksize=…) — обработка частями с агрегированием;
  • Parquet вместо CSV — в разы быстрее и меньше;
  • Polars — многопоточный, ленивое выполнение;
  • DuckDB — SQL-движок в процессе, хорошо справляется с данными больше памяти.

Пример

# медленно
df["segment"] = df.apply(lambda r: "vip" if r.amount > 10_000 else "regular", axis=1)

# быстро
df["segment"] = np.where(df["amount"] > 10_000, "vip", "regular")

# память
df["city"] = df["city"].astype("category")
df = pd.read_parquet("orders.parquet", columns=["user_id", "amount", "city"])

Что хотят услышать

  • Векторизация и почему apply медленный.
  • Конкретные приёмы замены.
  • Работа с данными, не помещающимися в память.

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем