📍 19 июля.
——————————
Распутье ускорения
——————————
Сначала ты идёшь простым путём, пишешь df["score"] = df.apply(score_row, axis=1) и смотришь, как медленно, но уверенно тикают проценты прогресса. Всё понятно, всё под контролем. Кажется, ты приручил данные.
Но потом, когда строк становится 100 тысяч, а потом и миллион и тут apply начинает сыпать пепел на твою клавиатуру.
Ты вызываешь профилировщик, ты перепроверяешь логику, но истина проста: ты просто пошёл по мягкой тропинке, когда рядом был каменный мост.
Иногда ускорение это не оптимизация, а философский выбор. Векторизация это путь, на котором ты жертвуешь выразительностью ради скорости. Она похожа на древний магический язык, который ты должен выучить, чтобы вызвать силу напрямую, без посредников-функций.
🔮 Заклинания ускорения обработки данных:
🟦 Если фильтруешь, то фильтруй по вектору:
df[df["status"] == "active"]
💡 Если нужно заменить по словарю зови .map():
df["city_code"] = df["city"].map(codebook).fillna(-1)
🖥 Если несколько условий используй
np.select():
conditions = [
df["sales"] == 0,
df["sales"] < 100,
df["sales"] >= 100,
]
choices = ["none", "low", "high"]
df["sales_level"] =
np.select(conditions, choices, default="unknown")
🖥 Если делишь на категории бери pd.cut() или pd.qcut():
df["bins"] = pd.cut(df["value"], bins=[0, 10, 20, 30], labels=["low", "mid", "high"])
🌜 Если фильтруешь по списку isin():
df[df["country"].isin(["DE", "FR", "IT"])]
Пусть это выглядит холодно, пусть это не так выразительно,
но когда ты гонишь миллионы значений сквозь цепочку NumPy,
ты уже не просто кодер, ты возница, несущийся по дороге векторного огня.
📝 Памятка себе, чтобы не тормозить:
apply это красиво, понятно, но медленно.
NumPy, Pandas и их встроенные методы твои ускоряющие заклинания.
Если пишешь lambda row: ... остановись. Возможно, ты пошёл не туда.
————————————————————-
📓 Дневник рутин
⚡️ Когда apply не тянет
🛤 Ищем кратчайший путь через данные