Многие считают, что Python «прожорлив» к памяти по умолчанию. Но часто проблема не в языке, а в архитектуре.
Вот 5 рабочих техник, которые помогли добиться такого результата:
1. Переход на Async и один воркер (Granian + Quart)
Традиционные синхронные серверы используют «веб-сад»: несколько процессов-воркеров, каждый из которых дублирует зависимости в памяти.
Решение: Переход на асинхронный фреймворк (Quart) и современный сервер (Granian). Асинхронность позволяет одному воркеру эффективно обрабатывать множество запросов, что позволило сократить количество процессов до одного без потери производительности.
2. Паттерн Raw + Dataclasses (вместо тяжелых ODM)
Библиотеки вроде MongoEngine или SQLAlchemy могут быть тяжелыми для памяти при больших объемах данных.
Решение: Использование «сырых» запросов к БД и простых Python-датаклассов с использованием
__slots__. Это исключает создание словаря __dict__ для каждого объекта, экономя около 100 МБ на процесс.3. Изоляция тяжелых импортов в подпроцессах
Если у вас есть фоновый демон (например, поисковый индексатор), он может тянуть в память всё основное приложение просто из-за цепочки импортов.
Решение: Вынесение тяжелого кода в отдельный файл, который запускается как subprocess. Основной процесс остается «легким» (22 МБ вместо 708 МБ), а тяжелые библиотеки выгружаются из памяти сразу после завершения задачи.
4. Локальные (Lazy) импорты
Импорт популярных библиотек стоит дорого сразу «на входе».
Решение: Перенесите
import внутрь функций. Библиотека загрузится только в момент вызова. В Python 3.15 эта механика станет еще проще благодаря PEP 810.5. Кэширование на диске (Diskcache)
Хранение кэша (фрагменты HTML, результаты API) в оперативной памяти — самый простой путь к утечкам и раздуванию процесса.
Решение: Библиотека diskcache. Она использует SQLite под капотом, позволяя хранить гигабайты кэша на диске с производительностью, близкой к RAM, но не занимая драгоценную оперативную память.
🔗 Ссылка на полную статью
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст
