Работа памяти в Python

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Введение

Python - интерпретируемый язык программирования, поэтому перед выполнением код транслируется в машиночитаемые инструкции - байт-код. Байт-код интерпретируется виртуальной машиной, определяемой реализацией языка, например, стандартной - CPython.

Python не взаимодействует с памятью - только с её виртуальным представлением. В процессе выполнения программы операционная система создаёт процесс и выделяет под него ресурсы. В отличие от С/С++ мы не можем управлять памятью из кучи напрямую, а делаем это посредством memory manager, который и обращается к памяти через Python/C API.

Организация доступной виртуальной памяти

Непосредственно с сырой памятью взаимодействует raw memory allocator. Поверх него работают аллокаторы, специфичные для отдельных типов объектов.

Python использует динамическую стратегию распределения памяти, то есть распределение памяти происходит во время выполнения программы.

Виртуальная память представляет собой иерархическую структуру, оптимизированную под блоки размером 256Кб.

  • Арена - 256Кб

  • Пул - 4Кб

  • Блок - от 16 до 512 байт

Блок

Содержит не более одного объекта и находится в одном из трёх состояний:

  • untouched - блок ещё не использовался

  • free - блок использовался механизмом памяти, но больше не содержит использованных программой данных

  • allocated - блок хранит данные

Пул

Пул также имеет три состояния:

  • used - занят

  • full - заполнен

  • empty - пуст (от used отличаются отсутствием allocated блоков) Пулы одного типа и одного размера блоков организованы в двусвязные списки.

Арена

Хранит в себе пулы любых видов. Арены хранятся в двусвязном списке и отсортированы по количеству доступных пустых пулов.

Освобождение памяти: счётчик ссылок и сборщик мусора

Так в Python всё является объектом, то каждое существо имеет прародителя - это PyObject. В нём определены счётчики ссылок и указатель на фактический тип объекта. Это хорошо работает пока Python не сталкивается с циклическим созданием ссылок. Например, когда два объекта ссылаются друг на друга. Для борьбы с такими проблемами поднимается сборщик мусора.

Советы

  • Обращайте внимание на работу с неизменяемыми объектами. К примеру, вместо присваивания строк, используйте .join() или .format().

  • Избегайте вложенных циклов. Это приводит к созданию чрезмерно большого количество объектов в виртуальной памяти процесса.

  • Используйте кэширование.

  • Профилируйте код.

Заключение

При использовании базовых возможностей Python знание о внутреннем устройстве память в интерпретаторе не обязательно, но когда дело доходит до широкомасштабных коммерческих проектов, то узнать тонкости для лучшей оптимизации кодовой базы всё же будет полезным.

Источник: https://habr.com/ru/post/721804/


Интересные статьи

Интересные статьи

Всем привет, я Алексей Некрасов - Lead направления Python в МТС и старший архитектор в MTS AI.Хочу поделиться своим опытом внедрения версионирования и рассказать, как сделать первый шаг в реализации с...
Почему так сложно понять asyncio?Асинхронное программирование традиционно относят к темам для "продвинутых". Действительно, у новичков часто возникают сложности с практическим освоением асинхронности....
Языков в мире программирования масса, но корону по праву носит Python. Многие полюбили его за гибкость, лаконичность, бесчисленное количество модулей и поддержку сообщества. Именно этот язык стал осно...
Есть такой сегмент продаж B2B. Вроде всё просто: компания продаёт компании. Но если разбираться, то компании-клиенту продаёт менеджер. А компания-продавец должна, как мин...
Этой весной мы оказались в очень весёлых условиях. Из-за пандемии стало ясно, что наши летние конференции необходимо переносить в онлайн. А чтобы провести их в онлайне качественно, на...