PYPROGLIB Telegram 7050
Как избавиться от 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 только если реально нужен полный независимый клон
— Во всех остальных случаях: поверхностная копия + модификация → намного быстрее

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94🔥4😁1



tgoop.com/pyproglib/7050
Create:
Last Update:

Как избавиться от 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 только если реально нужен полный независимый клон
— Во всех остальных случаях: поверхностная копия + модификация → намного быстрее

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

#буст

BY Библиотека питониста | Python, Django, Flask




Share with your friend now:
tgoop.com/pyproglib/7050

View MORE
Open in Telegram


Telegram News

Date: |

The SUCK Channel on Telegram, with a message saying some content has been removed by the police. Photo: Telegram screenshot. How to Create a Private or Public Channel on Telegram? Telegram channels fall into two types: 1What is Telegram Channels? Ng was convicted in April for conspiracy to incite a riot, public nuisance, arson, criminal damage, manufacturing of explosives, administering poison and wounding with intent to do grievous bodily harm between October 2019 and June 2020.
from us


Telegram Библиотека питониста | Python, Django, Flask
FROM American