2013-12-11 6 views
0

Прошу прощения за этот наивный вопрос. Я пытаюсь контролировать использование памяти моего кода на Python и сталкивается с перспективным пакетом memory_profiler. У меня есть вопрос об интерпретации вывода, созданного декодером @profile.Интерпретация вывода python memory_profiler

Вот пример вывода, который я получаю, запустив свой фиктивный код ниже:

dummy.py

from memory_profiler import profile 

@profile 
def my_func(): 
    a = [1] * (10 ** 6) 
    b = [2] * (2 * 10 ** 7) 
    del b 
    return a 

if __name__ == '__main__': 
    my_func() 

Вызов dummy.py по «питона dummy.py» возвращает таблицу ниже ,

Line # Mem использование Increment Line Содержание

3  8.2 MiB  0.0 MiB @profile 
4        def my_func(): 
5  15.8 MiB  7.6 MiB  a = [1] * (10 ** 6) 
6 168.4 MiB 152.6 MiB  b = [2] * (2 * 10 ** 7) 
7  15.8 MiB -152.6 MiB  del b 
8  15.8 MiB  0.0 MiB  return a 

Мой вопрос: что делает 8.2 MiB в первой строке таблицы соответствуют. Я предполагаю, что это первоначальное использование памяти самим интерпретатором python; но я не уверен. Если это так, существует ли способ, чтобы это базовое использование автоматически вычиталось из использования памяти в сценарии?

Большое спасибо за ваше время и внимание!

Noushin

+0

В будущем, когда вы спрашиваете о стороннем модуле (особенно тот, который не широко известен как NumPy), предоставьте ссылку. Я добавил его для вас на этот раз. – abarnert

+0

Спасибо abarnert! Будет ли это помнить :) Теперь, когда вы упомянули NumPy, могу ли я быть смелым и задать вам другой вопрос? Вы знаете, возвращает ли memory_profiler точные числа для использования массивов NumPy? (Я получал подозрительные результаты с помощью sys.getsizeof вызовов, прежде чем обнаруживать встроенный модуль «nbytes» массивов. Просто интересно, не ожидаю ли здесь подобных проблем) – user1146372

+0

Я понятия не имею. Но, по-видимому, он получает статистику использования памяти для вашего процесса из ОС или статистики кучи или чего-то подобного, не ходит по распределителям Python. Если это так, будет учитываться любая используемая память, даже если вы не можете понять, кто ее использует.Итак, я бы дал 10: 1 шансы или лучше, что, по крайней мере, в однопоточной программе, вам не о чем беспокоиться. Но на самом деле вам может быть лучше спросить автора. – abarnert

ответ

0

В соответствии с the docs:

Первый столбец представляет номер строки кода, который был профилированного, второй столбец (использование MEM) использование памяти интерпретатора Python после этой линии была выполнена. Третий столбец (Increment) представляет собой разницу в памяти текущей строки по отношению к последней.

Итак, это 8.2 MiB - это использование памяти после выполнения первой строки. Это включает в себя память, необходимую для запуска Python, загрузки вашего скрипта и всего его импорта (включая memory_profiler) и т. Д.

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

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

0

Разница в памяти между строками задается во второй колонке, или можно написать небольшой скрипт для обработки выходных данных.

Смежные вопросы