Этот Python-код выглядит нормально.
Он работает.
Он проходит тесты.
Но делает лишнюю работу в десятки, а иногда и в сотни раз.
Самая частая причина — ты случайно превращаешь линейный алгоритм в квадратичный.
Типичный сценарий:
- есть список
- внутри цикла ты каждый раз делаешь
in, count, index- на маленьких данных всё быстро
- на реальных — приложение начинает «тормозить без причины»
Проблема в том, что:
-
list — это O(n) для поиска- поиск внутри цикла = O(n²)
- Python честно делает работу, которую ты ему попросил
Профи думают не «работает или нет», а сколько лишних операций выполняется.
Правильный подход:
- если нужны проверки принадлежности — используй
set- если считаешь элементы — используй
dict или Counter- если данные не меняются — предвычисляй один раз
Этот приём один из самых частых источников скрытых performance-багов в Python-коде.
# ❌ Плохо: O(n²)
users = ["alice", "bob", "carol", "dave"]
for u in users:
if u in users: # каждый раз полный проход списка
process(u)
# ✅ Хорошо: O(n)
users = ["alice", "bob", "carol", "dave"]
users_set = set(users)
for u in users:
if u in users_set:
process(u)