Один из способов решения этой проблемы, если вы вызываете множество различных функций и не уверены в том, откуда происходит перестановка, - это использовать новую функцию построения графиков из memory_profiler .Сначала вы должны украсить различные функции, которые вы используете, с помощью @profile.Для простоты я буду использовать пример examples / numpy_example.py , поставляемый с memory_profiler, который содержит две функции: create_data()
и process_data()
Для запуска вашего сценария вместо запуска его синтерпретатор Python, вы используете исполняемый файл mprof, то есть
$ mprof run examples/numpy_example.py
Это создаст файл с именем mprofile_??????????.dat
, где?будет содержать числа, представляющие текущую дату.Чтобы отобразить результат, просто наберите mprof plot
, и он сгенерирует график, похожий на этот (если у вас есть несколько файлов .dat, он всегда займет последний):
Здесь вы видите потребление памяти со скобками, указывающими, когда вы входите / выходите из текущей функции.Таким образом, легко увидеть, что функция process_data()
имеет пик потребления памяти.Чтобы углубиться в свою функцию, вы можете использовать построчное профилирование, чтобы увидеть потребление памяти каждой строкой в вашей функции.Это выполняется с
python -m memory_profiler examples/nump_example.py
Это даст вам вывод, подобный следующему:
Line # Mem usage Increment Line Contents
================================================
13 @profile
14 223.414 MiB 0.000 MiB def process_data(data):
15 414.531 MiB 191.117 MiB data = np.concatenate(data)
16 614.621 MiB 200.090 MiB detrended = scipy.signal.detrend(data, axis=0)
17 614.621 MiB 0.000 MiB return detrended
, где ясно, что scipy.signal.detrend выделяет огромный объем памяти.