TGViewer
Библиотека питониста | Python, Django, Flask Библиотека питониста | Python, Django, Flask @pyproglib · 37.2K subscribers
Post #7050 3.17K
Как избавиться от deepcopy и ускорить код в несколько раз

copy.deepcopy() удобно использовать, когда нужно получить полностью независимую копию сложного объекта.

Но за удобство приходится платить: функция обходит всю структуру объекта, вызывает __deepcopy__, следит за циклическими ссылками и выделяет память под каждый элемент графа.

🤔 На практике это легко превращается в проблему. Пример из жизни — копирование состояния агента (≈1000 объектов) занимало 25% времени работы программы.

➡️ Почему deepcopy медленный
— обходит всю вложенную структуру
— вызывает Python-уровневый код (__deepcopy__)
— использует memo-словарь для учёта общих ссылок
— аллоцирует память под каждый объект

В простом бенчмарке:
shallow copy   → 1x  
deepcopy → ~660x медленнее
pickle / json → ~100–500x медленнее


➡️ Как избежать deepcopy (без ломки логики)

1️⃣ Используйте shallow copy или пересоздание объекта

Если нужно изменить только один атрибут — проще создать новый экземпляр, передав поля явно, чем делать deepcopy + модификацию:
# вместо
m2 = deepcopy(m1); m2.bar = 5

# лучше
m2 = Model(bar=5, foo=m1.foo, ...)


2️⃣ Копируйте только то, что реально нужно менять

В Pydantic-AI ушли от:
messages = deepcopy(self._state.message_history)


к:
messages = list(self._state.message_history)
last = deepcopy(messages[-1])
messages[-1] = last


→ в итоге 180× быстрее

3️⃣ Не копируйте неизменяемые структуры

Строки, числа, кортежи — и так безопасны. Не создавайте дубликаты ради дубликатов.

4️⃣ Используйте copy-on-write или diff-подход

Вместо полной копии состояния — сохраните разницу (diff) или применяйте изменения лениво — только при первом реальном изменении.

5️⃣ Сериализация как альтернатива

Иногда быстрее склонировать структуру через json.dumps/loads или pickle. Но подходит только для чистых данных (без сокетов, файлов и т.п.)

6️⃣ Используйте встроенные copy-механики

— NumPy: arr.copy() — копирует чистый буфер памяти
— pandas: .copy() / .loc[:] — быстрее, чем deepcopy DataFrame

➡️ В двух словах:
— deepcopy — мощь → но крайне дорогая
— Используйте deepcopy только если реально нужен полный независимый клон
— Во всех остальных случаях: поверхностная копия + модификация → намного быстрее

🐸 Библиотека питониста

#буст
  • 👍 9
  • ❤ 5
  • 🔥 4
  • 😁 1
More from @pyproglib
  1. Oct 9, 2026Post #7855
  2. Oct 9, 2026Showboat и Rodney помогают показать работу ИИ-агента Саймон Уиллисон собирает демонстрации…
  3. Oct 7, 2026🎓 С Днём учителя! Учиться никогда не поздно — особенно когда технологии меняются быстрее,…
  4. Oct 3, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
  5. Oct 2, 2026🎹 Что делать после ChatGPT? Следующий шаг — AI-агенты. Они не просто отвечают на запросы,…
  6. Sep 30, 2026🔥 Последний день для разработчиков AI уже пишет код. Теперь важнее научиться встраивать е…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →