Как уменьшить 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 вниз, чтобы он использовал меньше памяти? Стоит ли использовать редко используемые коды в модулях и вызывать их только при необходимости?
Ответы
Ответ 1
Organazing:
Ваш скрипт на python кажется действительно огромным, может быть, вам стоит сначала реорганизовать свой код, чтобы разделить его на несколько модулей или пакетов. Это, вероятно, облегчит профилирование кода и задачи оптимизации.
Вы можете посмотреть там:
И возможно:
Оптимизация:
Есть много вещей, которые можно сделать для оптимизации вашего кода...
Например, в отношении ваших структур данных... Если вы широко используете списки или списки, вы можете попытаться выяснить, где вам действительно нужны списки и где они могут быть заменены неизменяемыми структурами данных, такими как кортежи или "volatile" объектами, "ленивыми" контейнерами, такими как выражения генератора.
См:
На этих страницах вы можете найти полезную информацию и советы:
Кроме того, вам следует изучить свои способы ведения дел и задуматься над тем, есть ли способ сделать это менее жадно, как это лучше сделать в Python (некоторые советы вы найдете в теге pythonic)... Это особенно верно в Python, так как в Python часто есть один "очевидный" способ (и только один) делать вещи, которые лучше других (см. Дзен Python), который называется питоническим. Это не особенно связано с формой вашего кода, но также - и прежде всего - с производительностью. В отличие от многих языков, которые продвигают идею о том, что должно быть много способов что-либо сделать, Python предпочитает сосредоточиться только на наилучшем способе. Очевидно, что есть много способов сделать что-то, но часто один действительно лучше.
Теперь вы также должны проверить, используете ли вы лучшие методы для выполнения каких-либо задач, потому что pythonicality не подойдет для вас ваши алгоритмы.
Но, в конце концов, в зависимости от вашего кода сложно ответить, не увидев его.
И обязательно примите во внимание комментарии eumiro и Amr.
Ответ 2
Это видео может дать вам несколько хороших идей: http://pyvideo.org/video/451/pycon-2011---quot-dude--where--39-s-my-ram--quot-
Ответ 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
Конечно, "преждевременная оптимизация - корень всего зла". Также запишите профиль использования до и после добавления, чтобы увидеть, действительно ли оно что-то делает. Остерегайтесь взломать код (задыхаясь) с пониманием, что это может в конечном итоге не работать.