Узнайте, сколько памяти используется объектом в Python
Как бы вы узнали, сколько памяти используется объектом? Я знаю, что можно узнать, сколько используется блок кода, но не экземпляр объекта (в любое время в течение его жизни), чего я хочу.
Ответы
Ответ 1
Нет простого способа узнать размер памяти объекта python. Одна из проблем, которые вы можете обнаружить, заключается в том, что объекты Python, такие как списки и dicts, могут иметь ссылки на другие объекты python (в этом случае, каков будет ваш размер? Размер, содержащий размер каждого объекта или нет?). Есть некоторые указатели накладные и внутренние структуры, связанные с типами объектов и сбором мусора. Наконец, некоторые объекты python имеют неочевидное поведение. Например, списки резервирования для большего количества объектов, чем они есть, большую часть времени; dicts еще сложнее, так как они могут работать по-разному (у них разная реализация для небольшого количества ключей, а иногда и для выделения записей).
Существует большой фрагмент кода (и обновленный большой кусок кода), чтобы попытаться наилучшим образом приблизиться к размеру объекта python в памяти. Кроме того, некоторые более простые аппроксимации. Но они всегда будут приближениями.
Вы также можете проверить некоторое старое описание PyObject (внутренняя структура C, которая представляет практически все объекты python).
Ответ 2
Попробуйте следующее:
sys.getsizeof(object)
getsizeof() вызывает метод __sizeof__
объектов и добавляет дополнительные служебные данные сборщика мусора , если, объект управляемый сборщиком мусора.
Рекурсивный рецепт
Ответ 3
Другой подход - использовать рассол. См. этот ответ в дубликат этого вопроса.
Ответ 4
У меня нет личного опыта ни с одним из следующих, а с простым поиском "профилировщика Python [память]":
-
PySizer, "профайлер памяти для Python", найден в http://pysizer.8325.org/. Однако, похоже, страница указывает, что проект не обновлялся какое-то время и ссылается на...
-
Heapy, "поддержка [отладки] отладки и оптимизации в отношении проблем, связанных с памятью в программах Python", найдена в http://guppy-pe.sourceforge.net/#Heapy.
Надеюсь, что это поможет.
Ответ 5
Это необходимо использовать с осторожностью, поскольку переопределение объектов __sizeof__ может вводить в заблуждение.
Используя bregman.suite, некоторые тесты с sys.getsizeof выводят копию объекта массива (данных) в экземпляре объекта как большую, чем сам объект (mfcc).
>>> mfcc = MelFrequencyCepstrum(filepath, params)
>>> data = mfcc.X[:]
>>> sys.getsizeof(mfcc)
64
>>> sys.getsizeof(mfcc.X)
>>>80
>>> sys.getsizeof(data)
80
>>> mfcc
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90>
Ответ 6
Для больших объектов вы можете использовать несколько грубый, но эффективный метод:
проверьте, сколько памяти занимает ваш процесс Python в системе, затем удалите объект и сравните его.
Этот метод имеет много недостатков, но он даст вам очень быструю оценку для очень больших объектов.