Как я могу проверить использование памяти объектами в iPython? - PullRequest
33 голосов
/ 19 февраля 2009

Я использую iPython для запуска своего кода. Интересно, есть ли какой-нибудь модуль или команда, которая позволила бы мне проверить использование памяти объектом. Например:

In [1]: a = range(10000)
In [2]: %memusage a
Out[2]: 1MB

Что-то вроде %memusage <object> и возврат памяти, используемой объектом.

Дублирование

Узнайте, сколько памяти используется объектом в Python

Ответы [ 3 ]

49 голосов
/ 19 февраля 2009

К сожалению, это невозможно, но существует несколько способов приблизительного ответа:

  1. для очень простых объектов (например, целых, строк, чисел с плавающей запятой, двойных чисел), которые более или менее представлены в виде простых типов языка Си, вы можете просто рассчитать число байтов, как в решении Джона Малдера .

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

Существует одно большое препятствие с решением 2, которое состоит в том, что объекты обычно содержат ссылки на другие объекты. Например, dict содержит строковые ключи и другие объекты в качестве значений. Эти другие объекты могут быть общими. Поскольку pickle всегда пытается выполнить полную сериализацию объекта, он всегда будет переоценивать объем памяти, необходимый для хранения объекта.

19 голосов
/ 23 марта 2013

Если вы используете массив numpy , то вы можете использовать атрибут ndarray.nbytes для оценки его размера в памяти:

from pylab import *   
d = array([2,3,4,5])   
d.nbytes
#Output: 32
14 голосов
/ 19 февраля 2009

ОБНОВЛЕНИЕ: Вот еще один , возможно, более подробный рецепт для оценки размера объекта питона.

Вот ветка , посвященная аналогичному вопросу

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

Поскольку код не такой длинный, вот его прямая копия:

def sizeof(obj):
    """APPROXIMATE memory taken by some Python objects in 
    the current 32-bit CPython implementation.

    Excludes the space used by items in containers; does not
    take into account overhead of memory allocation from the
    operating system, or over-allocation by lists and dicts.
    """
    T = type(obj)
    if T is int:
        kind = "fixed"
        container = False
        size = 4
    elif T is list or T is tuple:
        kind = "variable"
        container = True
        size = 4*len(obj)
    elif T is dict:
        kind = "variable"
        container = True
        size = 144
        if len(obj) > 8:
            size += 12*(len(obj)-8)
    elif T is str:
        kind = "variable"
        container = False
        size = len(obj) + 1
    else:
        raise TypeError("don't know about this kind of object")
    if kind == "fixed":
        overhead = 8
    else: # "variable"
        overhead = 12
    if container:
        garbage_collector = 8
    else:
        garbage_collector = 0
    malloc = 8 # in most cases
    size = size + overhead + garbage_collector + malloc
    # Round to nearest multiple of 8 bytes
    x = size % 8
    if x != 0:
        size += 8-x
        size = (size + 8)
    return size
...