Рубрики
Без рубрики

Управление памятью и ограничения

Автор оригинала: Doug Hellmann.

sys включает несколько функций для понимания и управления использованием памяти.

Количество ссылок

Основная реализация Python (CPython) использует подсчет ссылок и сборку мусора для автоматического управления памятью. Объект автоматически помечается для сбора, когда его счетчик ссылок падает до нуля. Чтобы проверить счетчик ссылок существующего объекта, используйте getrefcount () .

sys_getrefcount.py

import sys

one  []
print('At start         :', sys.getrefcount(one))

two  one

print('Second reference :', sys.getrefcount(one))

del two

print('After del        :', sys.getrefcount(one))

Сообщаемое значение на самом деле на единицу выше ожидаемого, потому что существует временная ссылка на объект, удерживаемая самим getrefcount () .

$ python3 sys_getrefcount.py

At start         : 2
Second reference : 3
After del        : 2

Смотрите также

  • gc – управление сборщиком мусора с помощью функций, представленных в gc .

Размер объекта

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

sys_getsizeof.py

import sys


class MyClass:
    pass


objects  [
    [], (), {}, 'c', 'string', b'bytes', 1, 2.3,
    MyClass, MyClass(),
]

for obj in objects:
    print('{:>10} : {}'.format(type(obj).__name__,
                               sys.getsizeof(obj)))

getsizeof () сообщает размер объекта в байтах.

$ python3 sys_getsizeof.py

      list : 64
     tuple : 48
      dict : 240
       str : 50
       str : 55
     bytes : 38
       int : 28
     float : 24
      type : 1056
   MyClass : 56

Сообщаемый размер для настраиваемого класса не включает размер значений атрибутов.

sys_getsizeof_object.py

import sys


class WithoutAttributes:
    pass


class WithAttributes:
    def __init__(self):
        self.a  'a'
        self.b  'b'
        return


without_attrs  WithoutAttributes()
print('WithoutAttributes:', sys.getsizeof(without_attrs))

with_attrs  WithAttributes()
print('WithAttributes:', sys.getsizeof(with_attrs))

Это может создать ложное впечатление об объеме потребляемой памяти.

$ python3 sys_getsizeof_object.py

WithoutAttributes: 56
WithAttributes: 56

Для более полной оценки пространства, используемого классом, предоставьте метод __sizeof __ () для вычисления значения путем агрегирования размеров атрибутов объекта.

sys_getsizeof_custom.py

import sys


class WithAttributes:
    def __init__(self):
        self.a  'a'
        self.b  'b'
        return

    def __sizeof__(self):
        return object.__sizeof__(self) + \
            sum(sys.getsizeof(v) for v in self.__dict__.values())


my_inst  WithAttributes()
print(sys.getsizeof(my_inst))

В этой версии базовый размер объекта добавляется к размерам всех атрибутов, хранящихся во внутреннем __dict__ .

$ python3 sys_getsizeof_custom.py

156

Рекурсия

Разрешение бесконечной рекурсии в приложении Python может вызвать переполнение стека в самом интерпретаторе, что приведет к сбою. Чтобы исключить эту ситуацию, интерпретатор предоставляет способ управления максимальной глубиной рекурсии с помощью setrecursionlimit () и getrecursionlimit () .

sys_recursionlimit.py

import sys

print('Initial limit:', sys.getrecursionlimit())

sys.setrecursionlimit(10)

print('Modified limit:', sys.getrecursionlimit())


def generate_recursion_error(i):
    print('generate_recursion_error({})'.format(i))
    generate_recursion_error(i + 1)


try:
    generate_recursion_error(1)
except RuntimeError as err:
    print('Caught exception:', err)

Когда размер стека достигает предела рекурсии, интерпретатор вызывает исключение RuntimeError , чтобы программа имела возможность обработать ситуацию.

$ python3 sys_recursionlimit.py

Initial limit: 1000
Modified limit: 10
generate_recursion_error(1)
generate_recursion_error(2)
generate_recursion_error(3)
generate_recursion_error(4)
generate_recursion_error(5)
generate_recursion_error(6)
generate_recursion_error(7)
generate_recursion_error(8)
Caught exception: maximum recursion depth exceeded while calling
a Python object

Максимальные значения

Наряду с настраиваемыми значениями среды выполнения sys включает переменные, определяющие максимальные значения для типов, которые различаются от системы к системе.

sys_maximums.py

import sys

print('maxsize   :', sys.maxsize)
print('maxunicode:', sys.maxunicode)

maxsize – это максимальный размер списка, словаря, строки или другой структуры данных, определяемый типом размера интерпретатора C. maxunicode – это самая большая точка Unicode целого числа, поддерживаемая интерпретатором в текущем настроенном состоянии.

$ python3 sys_maximums.py

maxsize   : 9223372036854775807
maxunicode: 1114111

Значения с плавающей запятой

Структура float_info содержит информацию о представлении типа с плавающей запятой, используемом интерпретатором, на основе реализации float базовой системы.

sys_float_info.py

import sys

print('Smallest difference (epsilon):', sys.float_info.epsilon)
print()
print('Digits (dig)              :', sys.float_info.dig)
print('Mantissa digits (mant_dig):', sys.float_info.mant_dig)
print()
print('Maximum (max):', sys.float_info.max)
print('Minimum (min):', sys.float_info.min)
print()
print('Radix of exponents (radix):', sys.float_info.radix)
print()
print('Maximum exponent for radix (max_exp):',
      sys.float_info.max_exp)
print('Minimum exponent for radix (min_exp):',
      sys.float_info.min_exp)
print()
print('Max. exponent power of 10 (max_10_exp):',
      sys.float_info.max_10_exp)
print('Min. exponent power of 10 (min_10_exp):',
      sys.float_info.min_10_exp)
print()
print('Rounding for addition (rounds):', sys.float_info.rounds)

Эти значения зависят от компилятора и базовой системы. Эти примеры были созданы для OS X 10.9.5 на Intel Core i7.

$ python3 sys_float_info.py

Smallest difference (epsilon): 2.220446049250313e-16

Digits (dig)              : 15
Mantissa digits (mant_dig): 53

Maximum (max): 1.7976931348623157e+308
Minimum (min): 2.2250738585072014e-308

Radix of exponents (radix): 2

Maximum exponent for radix (max_exp): 1024
Minimum exponent for radix (min_exp): -1021

Max. exponent power of 10 (max_10_exp): 308
Min. exponent power of 10 (min_10_exp): -307

Rounding for addition (rounds): 1

Смотрите также

  • Заголовочный файл C float.h для локального компилятора содержит более подробную информацию об этих настройках.

Целочисленные значения

Структура int_info содержит информацию о внутреннем представлении целых чисел, используемом интерпретатором.

sys_int_info.py

import sys

print('Number of bits used to hold each digit:',
      sys.int_info.bits_per_digit)
print('Size in bytes of C type used to hold each digit:',
      sys.int_info.sizeof_digit)

Эти примеры были созданы для OS X 10.9.5 на Intel Core i7.

$ python3 sys_int_info.py

Number of bits used to hold each digit: 30
Size in bytes of C type used to hold each digit: 4

Тип C, используемый для внутреннего хранения целых чисел, определяется при построении интерпретатора. 64-разрядные архитектуры автоматически используют 30-разрядные целые числа по умолчанию, и их можно включить для 32-разрядных архитектур с помощью флага конфигурации --enable-big-digits .

Смотрите также

Порядок байтов

byteorder установлен в собственный порядок байтов.

sys_byteorder.py

import sys

print(sys.byteorder)

Значение либо big для прямого порядка байтов, либо little для прямого порядка байтов.

$ python3 sys_byteorder.py

little

Смотрите также

  • Википедия: Порядок байтов – Описание систем с прямым и обратным порядком байтов.
  • array и struct – другие модули, которые зависят от порядка байтов данных.
  • float.h – файл заголовка C для локального компилятора содержит
    дополнительные сведения об этих настройках.