Главная проблема в питоне это потребление памяти, есть такой механизм
как pymalloc
, введенный в питон с версии 2.3 суть его в том что
когда ОС выделяет память для работы программы, питон использует эту
память, но после этого не возвращает ее обратно в ОС, а оставляет за
собой этот кусок память как выделенный на работу программы, таким
образом мы сталкиваемся с проблемой, если в ходе работы программа
требует резкий скачок в используемой памяти, а после этого пика
памяти требуется уже меньше, то питон все равно оставляет эту память
для себя, что ускоряет работу самой программы на питоне, но замедляет
работу самой ОС.
Распределитель памяти Python, называемый pymalloc
- суть его работы
следующая, pymalloc
выделяет память не по кусочку на текущие
требования, а большим куском в 256 кб
и этот кусок памяти называется
Ареной, далее каждая такая Арена делится на кусочки по 4 кб
, эти
кусочки по 4 кб
называются pool
(пулами).
Далее каждый pool делится на блоки различной длинны, их длины могут быть различны, каждый такой блок выделяется под хранение конкретного обьекта.
Есть специальный связанный список usedpools
который хранит в себе
все пулы с блоками различных размеров, когда мы создаем обьект
то происходит поиск в блоках этих пулов, и если есть блок нужного
размера то обьект помещается в него.
Если нужного пула разбитого на нужные блоки не находится в списке
usedpools
то требуется найти свободный пул, то происходит поиск
в свободных пулах, что хранятся в списке freepools
если он есть,
то берем его из списка свободных пулов, если его нет то берется
Арена, и из нее выделяется кусочек для нового свободного пула,
если в Арене нет места то выделяется новая Арена.
Когда на обьект удаляется последняя ссылка, то обьект удаляется при помощи сборщика мусора, когда обьект удален его блок освобождается и помещается в пулл.