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: |

best-secure-messaging-apps-shutterstock-1892950018.jpg Just as the Bitcoin turmoil continues, crypto traders have taken to Telegram to voice their feelings. Crypto investors can reduce their anxiety about losses by joining the “Bear Market Screaming Therapy Group” on Telegram. The Standard Channel The best encrypted messaging apps During a meeting with the president of the Supreme Electoral Court (TSE) on June 6, Telegram's Vice President Ilya Perekopsky announced the initiatives. According to the executive, Brazil is the first country in the world where Telegram is introducing the features, which could be expanded to other countries facing threats to democracy through the dissemination of false content.
from us


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