Как импортировать класс из модуля без импорта всего модуля - PullRequest
1 голос
/ 15 апреля 2020

У меня очень большой модуль python (более 1 гигабайта), и я импортирую класс из этого модуля в другой скрипт python с командой from module import class. Дело в том, что когда я впервые запускаю свой сценарий python, потребление памяти действительно велико, и выполнение сценария занимает очень много времени (несколько минут!). Когда он запускается после этого, он занимает значительно меньше времени (несколько секунд) и использует меньше памяти, но все еще много для меня.

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

Есть ли способ изменить это, и мой скрипт не импортирует весь модуль, а только те детали, которые мне нужны c?

Спасибо, что нашли время ответить:)

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Спасибо за ответ;)

Дело в том, что большой модуль, который я импортирую, генерируется автоматически с помощью программы (которую мне было бы очень трудно изменить, поскольку я новичок в python). Так что я не могу контролировать его размер или расположение. Кроме того, я хотел бы изменить его, но файл слишком велик (более 1,6 миллиона строк кода). Я не могу редактировать его с помощью обычных API, которые открывают файл только в режиме «только для чтения» (возможно, у вас есть предложение здесь?) Тем не менее, я слышал о решении, которое может работать, я хотел бы узнать ваше мнение об этом: если я использую: 'if name =' main '' в конце файла и укажите там все классы и определения, которые я бы не использовал при импорте этого модуля, а только при его выполнении. Это будет выглядеть примерно так:

class1():
  def __init__():
    # code of the class1

class2():
  def __init__():
    # code of the class2

classn():
  def __init():
    # code of the classn


if __name__ = 'main':
  class1()
  class2()

Таким образом, когда я импортирую этот модуль в другой, python будет загружать только определения и переменные из classn() (а не из class1()). или class2) и, таким образом, загрузка импорта занимает значительно меньше времени. Я прав?

Спасибо.

0 голосов
/ 15 апреля 2020

Краткий ответ: нет, избежать этого невозможно. При первом импорте модуля в процесс gien выполняются все его инструкции верхнего уровня (import, def, class и, конечно, присваивание) для построения объекта module времени выполнения. Вот как Python работает, и есть очень веские причины, чтобы он работал именно так.

Теперь решение здесь довольно простое: 1 / разбейте ваш модуль giganti c на правильные (высокая когезия / низкая модулей) и импортируют только те части, которые вам нужны, и 2 / вместо определения гигабайт данных на верхнем уровне, инкапсулируют эту часть в функции с некоторой системой кэширования, чтобы избежать бесполезных повторных вычислений.

...