LINUX.ORG.RU

python: импорт модулей


0

0

Есть ли резон импортировать модули не глобально, а по требованию, если, например, функционал, предоставляемый модулем, не всегда востребуется?

Черевато ли чем-нибудь многократное импортирование уже загруженного модуля?

Можно ли выгрузить проимпортированный модуль?

anonymous

> Есть ли резон импортировать модули не глобально, а по требованию, если, например, функционал, предоставляемый модулем, не всегда востребуется?

Есть если:

Модулей много и/или они "тяжёлые"

Действия, производимые при инициализации модуля, нежелательны, если модуль не используется.

> Черевато ли чем-нибудь многократное импортирование уже загруженного модуля?

Вроде бы ничем.

> Можно ли выгрузить проимпортированный модуль?

Вроде бы del, но здесь мне пока не всё понятно.

Если серьёзно используете Python, советую присоединиться к рассылке http://itconnection.ru/cgi-bin/mailman/listinfo/zopyrus

DKorolkov
()
Ответ на: комментарий от DKorolkov

>Есть если: >Модулей много и/или они "тяжёлые"

вот вот :)

>> Можно ли выгрузить проимпортированный модуль? >Вроде бы del, но здесь мне пока не всё понятно.

Например, базовый функционал обеспечивается основным модулем; для выполнения определённой функции понадобилось подгрузить дополнительный модуль, который отъел долю ресурсов. Далее пользователь в течение продолжительного времени работает с основным модулем, а дополнительный ему больше не нужен; хотелось бы освободить ресурсы, занимаемые дополнительным модулем.

Спасибо за ссылку и ответ :)

anonymous
()
Ответ на: комментарий от DKorolkov

>> Можно ли выгрузить проимпортированный модуль?
>Вроде бы del

del <пемеременная модуля> не выгружает модуль, а просто убивает
связанное с ним имя. Остается ссылка на модуль в sys.modules.
Если же удалить sys.modules['modl'], то модуль удаляеся
(только об этом в документации я ни чего не нашел)

>>> import sys,modl
modl
>>> del modl,sys.modules['modl']
C::__del__
>>>
[ks@const:~]% cat modl.py
print "modl"

class C:
        def __del__(self):
                print "C::__del__"

c=C()

kosmonavt
()
Ответ на: комментарий от anonymous

Segmentation fault при создании fstream :-( ???

все импортируемые модули попадают в словарь sys.modules

Если модуль уже был импортирован, то просто возвращается ссылка из этого словаря. Таким образом, моно импортить моули по необходимости из функции к-я их юзаеть, но там есть небольшие ограничение по синтаксису ( from mymodule import * не работает - она разрешена тока в голб. пр-ве имен нас я помню).

Про выгрузщку - с трудом себе представляю толстый модуль к-й много всего съел.. но тем не менее - если ты его del у себя, от он останеться в sys.modules. Если ты его del еще и из sys.modules, то он умрет если на него никто больше не ссылается (см как работает сборка мусора, по ссылке наверху). Если он умер, но на его куски кто то ссылается еще - то куски останутся жить, пока на них ссылаются.

AIv ★★★★★
()
Ответ на: Segmentation fault при создании fstream :-( ??? от AIv

>Если ты его del еще и из sys.modules, то он умрет если на него никто больше не ссылается (см как работает сборка мусора, по ссылке наверху). Если он умер, но на его куски кто то ссылается еще - то куски останутся жить, пока на них ссылаются.

ясно

>с трудом себе представляю толстый модуль к-й много всего съел..

Не слишком много, но, например, reportlab тянет ~3mb, а печать отчётов доволе разовая процедура, вот и хотелось бы после неё "прибрать" :)

Спасибо!

to kosmonavt: большое спасибо за пример, нагляднее некуда :)

anonymous
()

вспомни на каком языке ты пишешь программу, посмотри размеры оперативки на современных РС

мое мнение пусть лучше эти мегабайты будут висеть в памяти, чем каждый раз грузится с диска

anonymous
()
Ответ на: комментарий от anonymous

Во-во. Выгружать имеет смысл данные, а не код.

AngryElf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.