Автор оригинала: 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
.
Смотрите также
- Изменения API сборки и C из Что нового в Python 3.1
Порядок байтов
byteorder
установлен в собственный порядок байтов.
sys_byteorder.py
import sys print(sys.byteorder)
Значение либо big
для прямого порядка байтов, либо little
для прямого порядка байтов.
$ python3 sys_byteorder.py little
Смотрите также
- Википедия: Порядок байтов – Описание систем с прямым и обратным порядком байтов.
- array и struct – другие модули, которые зависят от порядка байтов данных.
-
float.h
– файл заголовка C для локального компилятора содержит - дополнительные сведения об этих настройках.
-