Как уменьшить Python Script Использование памяти - программирование
Подтвердить что ты не робот

Как уменьшить Python Script Использование памяти

У меня очень большой python script, 200K, что я хотел бы использовать как можно меньше памяти. Это выглядит примерно так:

# a lot of data structures
r = [34, 78, 43, 12, 99]

# a lot of functions that I use all the time
def func1(word):
    return len(word) + 2

# a lot of functions that I rarely use
def func1(word):
    return len(word) + 2


# my main loop
while 1:
   # lots of code
   # calls functions

Если я помещаю функции, которые я редко использую в модуле, и импортирую их динамически только в случае необходимости, я не могу получить доступ к данным. Это, насколько я понял.

Я новичок в python.

Может ли кто-нибудь поставить меня на правильный путь? Как я могу разбить этот большой script вниз, чтобы он использовал меньше памяти? Стоит ли использовать редко используемые коды в модулях и вызывать их только при необходимости?

4b9b3361

Ответ 1

Organazing:

Ваш скрипт на python кажется действительно огромным, может быть, вам стоит сначала реорганизовать свой код, чтобы разделить его на несколько модулей или пакетов. Это, вероятно, облегчит профилирование кода и задачи оптимизации.

Вы можете посмотреть там:

И возможно:

Оптимизация:

Есть много вещей, которые можно сделать для оптимизации вашего кода...

Например, в отношении ваших структур данных... Если вы широко используете списки или списки, вы можете попытаться выяснить, где вам действительно нужны списки и где они могут быть заменены неизменяемыми структурами данных, такими как кортежи или "volatile" объектами, "ленивыми" контейнерами, такими как выражения генератора.

См:

На этих страницах вы можете найти полезную информацию и советы:

Кроме того, вам следует изучить свои способы ведения дел и задуматься над тем, есть ли способ сделать это менее жадно, как это лучше сделать в Python (некоторые советы вы найдете в теге pythonic)... Это особенно верно в Python, так как в Python часто есть один "очевидный" способ (и только один) делать вещи, которые лучше других (см. Дзен Python), который называется питоническим. Это не особенно связано с формой вашего кода, но также - и прежде всего - с производительностью. В отличие от многих языков, которые продвигают идею о том, что должно быть много способов что-либо сделать, Python предпочитает сосредоточиться только на наилучшем способе. Очевидно, что есть много способов сделать что-то, но часто один действительно лучше.

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

Но, в конце концов, в зависимости от вашего кода сложно ответить, не увидев его.

И обязательно примите во внимание комментарии eumiro и Amr.

Ответ 3

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

Кстати, вы отмечаете, что у вас много структур данных, определенных в верхней части вашего script, что подразумевает, что все они загружены в память в начале. Если это очень большой набор данных, попробуйте переместить определенные наборы данных для разделения файлов и загрузить их только по мере необходимости. (с использованием модуля csv или numpy.loadtxt() и т.д.)

Отделяйтесь от использования меньше памяти, а также изучите способы более эффективного использования памяти. Например, для больших наборов числовых данных массивы numpy представляют собой способ хранения информации, которая обеспечит лучшую производительность в ваших расчетах. Существует несколько советов, датированных http://wiki.python.org/moin/PythonSpeed/PerformanceTips

Ответ 4

Движущиеся функции не изменят использование памяти. Как только вы импортируете этот другой модуль, он определит все функции в модуле. Но функции не занимают много памяти. Являются ли они чрезвычайно повторяющимися, возможно, у вас может быть меньше кода путем рефакторинга функций?

Вопрос

@eumiro прав: вы уверены, что ваш script использует слишком много памяти? Сколько памяти она использует, и почему это слишком много?

Ответ 5

Если вы пользуетесь преимуществами ООП и имеете некоторые объекты, скажите:

class foo:
    def __init__(self, lorem, ipsum):
        self.lorem = lorem
        self.ipsum = ipsum
    # some happy little methods

Вы можете заставить объект занимать меньше памяти, вставив:

__slots__ = ("lorem", "ipsum")

прямо перед функцией __init__, как показано:

class foo:
    def __init__(self, lorem, ipsum):
        self.lorem = lorem
        self.ipsum = ipsum
    # some happy little methods

Конечно, "преждевременная оптимизация - корень всего зла". Также запишите профиль использования до и после добавления, чтобы увидеть, действительно ли оно что-то делает. Остерегайтесь взломать код (задыхаясь) с пониманием, что это может в конечном итоге не работать.