Значение sys.getsizeof () не увеличивается с увеличением значения с плавающей запятой - PullRequest
2 голосов
/ 23 апреля 2019

Играя с sys.getsizeof(), я заметил, что он возвращает более высокие значения для ints при увеличении их величины, означая, что они используют больше памяти:

>>> sys.getsizeof(3)
28
>>> 

>>> sys.getsizeof(300000000000000000000000)
36

Однако с floats яполучить одинаковое использование памяти независимо от величины:

>>> sys.getsizeof(3.0)
24

>>> sys.getsizeof(300000000000000.111111111)
24

>>> sys.getsizeof(300000000000000000000000.111111111)
24

>>> sys.getsizeof(300000000000000000000000.1111133333333331111)
24

Согласно документам , я должен получить точное использование памяти встроенных типов:

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

1 Ответ

2 голосов
/ 23 апреля 2019

Название float происходит от того факта, что они являются числами с плавающей точкой .

Для упрощения floats сохраняются как a * b ** c, где a, b и c каждый занимает определенное фиксированное число битов соответственно. Следовательно, интуитивно, если f является числом с плавающей запятой, f * 10 ** 10 не займет намного больше места, чем f, поскольку нам нужно только увеличить c на log_2 log_2 (10 ** 10) = 5 (обычно b является константой, например 2).

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

В Python ints являются фиксированной точкой, произвольно точной и переменной шириной . Это означает, что int может вырасти настолько большим, насколько вы хотите, с учетом ограничений памяти. Объем занимаемого им пространства пропорционален его величине, поскольку он должен хранить каждую отдельную цифру по отдельности (больше или меньше), а не вычислять по экспоненте, как в floats. Следовательно, умножение int i на 10 ** 10 потребует log_2(10 ** 10) = 33 дополнительных битов.

Для полноты я бы отметил, что в чем-то вроде C соответствующий int, как и float, является фиксированной шириной, и, следовательно, эквивалент sizeof вернет одно и то же значение независимо от величины int.

...