Для эффективности я пытаюсь выяснить, как работает python с его кучей объектов (и системой пространств имен, но это более или менее понятно). Итак, в основном, я пытаюсь понять, когда объекты загружаются в кучу, сколько их есть, сколько они живут и т.д.
И мой вопрос , когда я работаю с пакетом и импортирую что-то из него:
from pypackage import pymodule
какие объекты загружаются в память (в кучу объекта интерпретатора python)? И в целом: что происходит?:)
Я думаю, что приведенный выше пример делает что-то вроде:
в памяти был создан некоторый объект пакета pypackage
(который содержит некоторую информацию о пакете, но не слишком много), модуль pymodule
был загружен в память и его ссылка была создана в локальном пространстве имен. Здесь важно: в памяти не создавались другие модули pypackage
(или других объектов), если только это не указано явно (в самом модуле или где-то в трюках инициализации пакета и перехватах, которые я не знаком с). В конце единственная важная вещь в памяти - pymodule
(т.е. Все объекты, которые были созданы при импорте модуля). Это так? Буду признателен, если кто-нибудь прояснит этот вопрос. Может быть, вы могли бы посоветовать какую-нибудь полезную статью об этом? (документация охватывает более конкретные вещи)
Я нашел следующее к тому же вопросу об импорте модулей:
Когда Python импортирует модуль, он сначала проверяет реестр модулей (sys.modules), чтобы узнать, импортирован ли модуль. Если это так, Python использует существующий объект модуля как есть.
В противном случае Python делает что-то вроде этого:
- Создайте новый пустой объект модуля (это, по существу, словарь)
- Вставьте этот объект модуля в словарь sys.modules
- Загрузите объект кода модуля (при необходимости сначала скомпилируйте модуль)
- Выполнить объект кода модуля в пространстве имен новых модулей. Все переменные, назначенные кодом, будут доступны через объект модуля.
И был бы признателен за то же объяснение относительно пакетов.
Кстати, с пакетами имя модуля добавляется в sys.modules
странно:
>>> import sys
>>> from pypacket import pymodule
>>> "pymodule" in sys.modules.keys()
False
>>> "pypacket" in sys.modules.keys()
True
А также есть практический вопрос, касающийся одного и того же вопроса.
Когда я создаю набор инструментов, которые могут использоваться в разных процессах и программах. И я поместил их в модули. У меня нет выбора, кроме как загрузить полный модуль, даже если я хочу использовать только одну функцию, объявленную там. Как я вижу, можно сделать эту проблему менее болезненной, создав небольшие модули и помещая их в пакет (если пакет не загружает все его модули при импорте только одного из них).
Есть ли лучший способ сделать такие библиотеки на Python? (С помощью простых функций, которые не имеют каких-либо зависимостей в их модуле.) Возможно ли с помощью C-расширений?
PS извините за такой длинный вопрос.